最近在了解学习frePPLe,可能会更新的比较慢,有懂frePPLe的兄弟可以联系我,取长补短啊。
在生产环境中,我们为了防止用户在使用过程中,误入数据库管理页面(web/database/manager),进行相关操作,时常屏蔽数据库管理页面。
但我们经常又需要操控数据库:备份、查错等。
于是就有了此篇,通过服务器命令管理数据库。此篇源于odoo14 cookbook简介中的第一章。
首先你要明白一点:odoo的数据大结构:
通过conf配置文件:data_dir说明conf配置文件参数作用
备份数据库zip包

可以发现odoo的数据存储分为两大块:
一个是data_dir指定目录,也就是filestore
另一个是dump.sql,数据库数据
了解这一点,下面的内容就比较好理解了,我们所有的备份、还原都要照顾这两块。
初始化新数据库
创建新数据库,可以使用如下的一行代码:
$ createdb dbname && odoo-bin -d dbname
odoo-bin:-d database_name:默认使用这一数据库。
上述代码块中可增加: -i sale,purchase,stock。在创建数据库后,安装销售、采购、库存模块。
复制数据库
停止odoo服务并运行如下命令,可以复制数据库:
$ createdb -T dbname newdbname
$ cd ~/.local/share/Odoo/filestore # 如果你修改了data_dir请调整此处
$ cp -r dbname newdbname
createdb -T 仅在数据库没有活跃会话时,才能使用,这表示复制数据库之前,你需要关闭相关Odoo服务。
只有此命令需要关闭odoo服务,本篇其余的命令不需要。
删除一个实例
$ dropdb dbname
$ rm -rf ~/.local/share/Odoo/filestore/dbname
备份
借用pg_dump备份,相关官方文档:http://www.postgres.cn/docs/13/app-pgdump.html
$ pg_dump -Fc -f dbname.dump dbname
$ tar cjf dbname.tgz dbname.dump ~/.local/share/Odoo/filestore/dbname
还原
可运行如下命令来还原备份:
$ tar xf dbname.tgz
$ pg_restore -C -d dbname dbname.dump
注意事项
在window环境下,执行以上命令,比如createdb,dropdb等这些简单的命令,发现这些命令并不好用,可能是以下原因:
psql,createdb,dropdb这些命令是在dos命令下直接可以使用的,当然首先是需要将PostgreSQL的bin目录配置到环境变量中,你会发现在bin目录下有这些命令的exe文件。
如果没有配置关于用户,主机,端口这些环境变量则需要将这些加入到命令行中,如:
C:\Users\Administrator>createdb –h localhost –U postgres–p 5432 demo
点击回车之后,会让输入数据库的密码,输入之后,你可以通过GUI工具查看是否已经完成了创建。
window环境还是比较推荐GUI工具,如官方自带的pgAdmin 4 。
上述命令的意思是:
-h localhost 是为了确定登录的主机
-U postgres 是确定登录数据库的用户名,其中postgres是安装PostgreSQL数据库时默认的用户
-p 5432 是确定端口号,默认的端口号是5432,如同MySQL的3306
为了不用每次使用psql,createdb,dropdb这些命令时都要输入-h,-U,-p这些参数,可以选择在环境变量中加入配置,如下:
PGHOST=localhost 配置登录主机
PGPORT=5432 配置端口号
PGUSER=postgres 配置登录用户
在环境变量中加入这些配置之后就可以直接使用psql,createdb,dropdb等命令而不需要加入-h,-U,-p这些参数。
删除数据库时会出现类似的错误,我要删除的数据库是demo:
ERROR: database"demo" is being accessed by other users 描述: There is 1 other sessionusing the database.
在GUI工具如:pgAdmin中,我们可以看到数据库是在连接状态,当然可以通过GUI工具直接关闭连接或者删除。
当然我们可以通过命令行的方式来处理,首先要关闭指定数据库连接,这里是demo,如下:
SELECT pg_terminate_backend(pg_stat_activity.pid) FROMpg_stat_activity WHERE datname='demo’ AND pid<>pg_backend_pid();
然后再执行删除数据库命令:
DROP DATABASE testdb;




