暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

管理数据库

odoo研习社 2021-06-28
817

最近在了解学习frePPLe,可能会更新的比较慢,有懂frePPLe的兄弟可以联系我,取长补短啊。

在生产环境中,我们为了防止用户在使用过程中,误入数据库管理页面(web/database/manager),进行相关操作,时常屏蔽数据库管理页面。

但我们经常又需要操控数据库:备份、查错等。

于是就有了此篇,通过服务器命令管理数据库。此篇源于odoo14 cookbook简介中的第一章。


首先你要明白一点:odoo的数据大结构:

可以发现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等这些简单的命令,发现这些命令并不好用,可能是以下原因:

  1. psql,createdb,dropdb这些命令是在dos命令下直接可以使用的,当然首先是需要将PostgreSQL的bin目录配置到环境变量中,你会发现在bin目录下有这些命令的exe文件。

  2. 如果没有配置关于用户,主机,端口这些环境变量则需要将这些加入到命令行中,如:

C:\Users\Administrator>createdb h localhost U postgresp 5432 demo

点击回车之后,会让输入数据库的密码,输入之后,你可以通过GUI工具查看是否已经完成了创建。

window环境还是比较推荐GUI工具,如官方自带的pgAdmin 4 。

上述命令的意思是:

  • -h localhost 是为了确定登录的主机

  • -U postgres 是确定登录数据库的用户名,其中postgres是安装PostgreSQL数据库时默认的用户

  • -p 5432 是确定端口号,默认的端口号是5432,如同MySQL的3306

  1. 为了不用每次使用psql,createdb,dropdb这些命令时都要输入-h,-U,-p这些参数,可以选择在环境变量中加入配置,如下:

PGHOST=localhost 配置登录主机 

PGPORT=5432 配置端口号 

PGUSER=postgres 配置登录用户

在环境变量中加入这些配置之后就可以直接使用psql,createdb,dropdb等命令而不需要加入-h,-U,-p这些参数。

  1. 删除数据库时会出现类似的错误,我要删除的数据库是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;


文章转载自odoo研习社,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论