PostgreSQL创建数据库自动生成非预期表,如何恢复template1?
问题确认
是的,你确实误修改了PostgreSQL的默认模板库template1。PostgreSQL中所有新创建的数据库都会默认克隆template1的结构与数据,这就是后续创建的sports_teams库自动包含albums和artists表的原因。
恢复template1至初始状态的步骤
1. 断开所有template1的连接
首先要终止所有连接到template1的进程,否则无法修改该数据库:
-- 查询连接到template1的进程 SELECT pid, usename, datname FROM pg_stat_activity WHERE datname = 'template1'; -- 终止进程(替换下方pid为查询结果中的进程ID) SELECT pg_terminate_backend(pid);
如果无法通过SQL终止进程,可直接重启PostgreSQL服务(例如Ubuntu系统执行sudo systemctl restart postgresql)。
2. 取消template1的模板属性
默认状态下无法直接删除模板数据库,先修改其属性:
ALTER DATABASE template1 WITH IS_TEMPLATE = false;
3. 删除被污染的template1
DROP DATABASE template1;
4. 从原始干净模板重建template1
PostgreSQL自带的template0是初始干净模板,用它重建template1:
CREATE DATABASE template1 TEMPLATE template0;
5. 恢复template1的模板属性
将新创建的template1设回默认模板库:
ALTER DATABASE template1 WITH IS_TEMPLATE = true;
验证恢复效果
重新连接到template1并查看表列表,确认albums和artists表已不存在:
\c template1 \dt
此时新创建的数据库将不再自动包含之前的表结构与数据。
另外,你之前执行DROP DATABASE music_library;时出现错误,是因为命令中误写了数据库名music,正确命令应为DROP DATABASE music_library;(若该数据库存在)。
内容的提问来源于stack exchange,提问作者Paul Patterson
相关产品推荐
相关产品推荐

