2015-09-07 35 views
8

Ogni volta che provo a duplicare o eliminare i database dall'interfaccia ottengo sempre questo errore, anche se tutti gli utenti sono disconnessi:Non riesco a duplicare o rilasciare il database dall'interfaccia Odoo perché ci sono sessioni che utilizzano il database. Come risolverlo in modo permanente?

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

Poi, se vuole duplicare o eliminare un database devo correre questo interrogare di interrompere tutti i collegamenti prima:

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

Quello che vorrei fare è quello di sostituire le seguenti controller al fine di eseguire la query sempre prima dell'esecuzione delle funzioni duplicate_database e drop:

@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')} 

E ho trovato questa nota nel Documentation of Odoo:

[...] Questa operazione richiede che non vi sia alcuna connessione al database essere duplicato, ma vudù non suddivide esistente/connessioni in sospeso, quindi il riavvio del server è il modo più semplice per garantire che tutto sia nello stato giusto.

È sicuro sovrascrivere questi controller? Qual è il modo migliore per farlo? Mi piacerebbe farlo usando l'interfaccia perché se lo faccio manualmente o se devo fermare il server ogni volta che è necessario è molto fastidioso.

risposta

-1

Vai al database postgresql e fai clic con il tasto destro del mouse sul tuo database, avrai un'opzione di rilascio/cancellazione del tuo database. A quel tempo se ottieni questo errore, prova a fermare il server odoo dalla lista dei servizi e riprova.

+0

Penso che tu non stia capendo cosa sto cercando di fare. Sto cercando di rimuovere il database dall'interfaccia di Odoo Database Manager, interrompendo le connessioni prima di farlo, per evitare che il database di origine di ERROR "database_name" sia accessibile ad altri utenti.E non voglio interrompere il server Odoo e non voglio interrompere manualmente le connessioni – ChesuCR

1

Non è possibile eliminare il database Postgres mentre i client sono connessi ad esso. Abbastanza robusto modo di lavorare intorno ad esso, è

Assicurarsi che nessuno in grado di connettersi a questo database

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

Forza disconnessione di tutti i client connessi a questo database.

Per postgres < 9.2:

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

per le versioni di Postgres> = 9.2 cambiamento procpid a pid:

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

rilasciarlo

DROP DATABASE mydb; 

punti 1 e 2 richiedono privilegi di superutente , il passaggio 3 richiede il privilegio del proprietario del database.

Non è possibile eseguire tutto utilizzando solo l'utilità dropdb, che è un semplice wrapper sulla query del server DROP DATABASE.

+0

Ho già questa query nella domanda. Quello che voglio fare è aggiungere quella query al controller per eseguirlo sempre automaticamente quando cado o quando duplo il database. Ma non so come dovrei farlo. Per esempio non so dove sia il metodo 'drop (password, db):' dichiarato – ChesuCR