異常:
postgres=# CREATE DATABASE deepflow_agent2;
ERROR: source database "template1" is being accessed by other users
DETAIL: There are 2 other sessions using the database
如何斷聯這兩個session
要解決 PostgreSQL 中因?template1
?數據庫被占用導致無法創建新數據庫的問題,請按以下步驟操作:
1.?查看占用 template1 的會話
SELECT pid, usename, application_name, client_addr,query_start,state FROM pg_stat_activity WHERE datname = 'template1' AND pid <> pg_backend_pid(); -- 排除當前會話
2.?終止占用會話(三種方法)
方法1:逐個終止(推薦)
-- 對查詢結果中的每個 pid 執行 SELECT pg_terminate_backend(目標pid); -- 替換為目標pid
方法2:批量終止所有占用會話
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'template1'AND pid <> pg_backend_pid();
方法3:使用 template0 模板創建(避免沖突)
CREATE DATABASE deepflow_agent2 TEMPLATE template0; -- 使用空白模板
3.?驗證會話是否終止
SELECT count(*) FROM pg_stat_activity WHERE datname = 'template1'; -- 返回 1 表示只剩當前會話
4.?重新創建數據庫
CREATE DATABASE deepflow_agent2;
預防措施:
-
永久解決方案:
ALTER DATABASE template1 ALLOW_CONNECTIONS = OFF; -- 禁止連接模板庫
-
設置默認模板:
ALTER DATABASE template1 IS_TEMPLATE = false; -- 取消模板屬性
-
使用專用模板:
CREATE DATABASE my_template IS_TEMPLATE = true; CREATE DATABASE new_db TEMPLATE my_template; -- 使用自定義模板
關鍵說明:
-
pg_terminate_backend()
?需要超級用戶權限 -
生產環境謹慎操作,終止會話可能導致用戶操作中斷
-
使用?
template0
?是最安全的替代方案,它是不可修改的干凈模板
執行后如果仍有問題,檢查 PostgreSQL 日志:
tail -n 50 /var/log/postgresql/postgresql-*.log