我无法从Odoo界面复制或删除数据库,因为有会话使用数据库。如何永久修复它?

时间:2015-09-07 11:27:18

标签: postgresql controller odoo odoo-8 connection

每当我尝试从界面复制或删除数据库时,即使所有用户都已注销,我也总会收到此错误:

ERROR:  source database "database_name" is being accessed by other users
DETAIL:  There are 5 other sessions using the database.

然后,如果想要复制或删除数据库,我必须运行此查询以终止所有连接:

SELECT pg_terminate_backend(pg_stat_activity.pid) 
FROM pg_stat_activity 
WHERE pg_stat_activity.datname = 'database_name' AND pid <> pg_backend_pid();

我想要做的是覆盖以下控制器,以便在执行函数duplicate_databasedrop之前始终运行查询:

@http.route('/web/database/duplicate', type='json', auth="none")
def duplicate(self, fields):
    params = dict(map(operator.itemgetter('name', 'value'), fields))
    duplicate_attrs = (
        params['super_admin_pwd'],
        params['db_original_name'],
        params['db_name'],
    )
    return request.session.proxy("db").duplicate_database(*duplicate_attrs)

@http.route('/web/database/drop', type='json', auth="none")
def drop(self, fields):
    password, db = operator.itemgetter(
        'drop_pwd', 'drop_db')(
            dict(map(operator.itemgetter('name', 'value'), fields)))
    try:
        if request.session.proxy("db").drop(password, db):
            return True
        else:
            return False
    except openerp.exceptions.AccessDenied:
        return {'error': 'AccessDenied', 'title': 'Drop Database'}
    except Exception:
        return {'error': _('Could not drop database !'), 'title': _('Drop Database')}

我在Documentation of Odoo

中找到了这个说明
  

[...]此操作要求没有连接   数据库被复制,但Odoo目前没有破解   现有/未完成的连接,所以重新启动服务器是   确保一切都处于正确状态的最简单方法。

可以安全地覆盖这些控制器吗?有什么更好的方法呢?我想使用界面执行此操作,因为如果我手动执行此操作或者每次需要停止服务器都非常烦人。

2 个答案:

答案 0 :(得分:1)

当客户端连接到postgres数据库时,您无法删除它。

是一种非常强大的解决方法

确保没有人可以连接到此数据库

update pg_database set datallowconn = 'false' where datname = 'mydb';

强制断开连接到此数据库的所有客户端。

对于postgres&lt; 9.2:

SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE datname = 'mydb';

对于postgres版本&gt; = 9.2将procpid更改为pid:

SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'mydb';

放弃它

DROP DATABASE mydb;

步骤1和2需要超级用户权限,步骤3需要数据库所有者权限。

你不能只使用dropdb实用程序 - 这是DROP DATABASE服务器查询的简单包装器。

答案 1 :(得分:-1)

转到postgresql数据库并右键单击您的数据库,您将获得删除/删除数据库的选项。那时如果你收到此错误,请尝试从服务列表中停止odoo服务器并重试。