不過。。。因為近期簡單的整理了一下 Dump 的步驟,所以就記錄下來。
這篇特別一點點的地方,主要是用了 psql Script 的互動式問答功能作輔助~
[postgres@old-server ~]$ pg_dumpall --schema-only --file=~/dumpall_ddl.sql
2) 依照需要,微調 DDL 檔 ~/dumpall_ddl.sql:直接用 vim 處理
通常會改的:
- Tablespace 位置
- 外部表(Foreign Data Wrapper)連線資訊
- 表格改成 Partitioned Table
3) 使用 SQL 長出所有的 DB 的 dump 指令(使用 Custome Mode,多執行緒)
以下整理成一份互動式 Script
--
-- Script Name: dmp_restore_cmds.sql
--
\timing off
-- Interactive Prompt
\prompt '# of Jobs: ' njob
\prompt 'Dump File Output dir: ' dmp_dir
\prompt 'New superuser: ' newsuperu
-- Non-Interactive Version
-- \set njob 5
-- \set dmp_dir /tmp/
select set_config('psql.njob', :'njob', false);
select set_config('psql.dmp_dir', :'dmp_dir', false);
select set_config('psql.newsuperu', :'newsuperu', false);
\t on
select '## Data Dump Command'
UNION
select
'nohup pg_dump --data-only -Fd -j ' ||
current_setting('psql.njob') ||
' --disable-trigger --superuser=' ||
current_setting('psql.newsuperu') ||
' --file=' ||
current_setting('psql.dmp_dir') || '/dmp_' || datname ||
-- ' --host=' || host(inet_server_addr()) ||
' --dbname=' || datname ||
' 2>&1 &'
FROM pg_database
WHERE datname NOT LIKE 'template%';
select '## Data Restore Command'
UNION
select
'nohup pg_restore --data-only -Fd -j ' ||
current_setting('psql.njob') ||
' --disable-trigger --superuser=' ||
current_setting('psql.newsuperu') ||
' --dbname=' || datname || ' ' ||
current_setting('psql.dmp_dir') || '/dmp_' || datname ||
' 2>&1 &'
FROM pg_database
WHERE datname NOT LIKE 'template%';
這邊使用一組特別選項,--disable-trigger 與 --superuser,這個在有用到 Foreign Key 的表格資料匯入/匯出時,可以避免資料匯入先後順序造成的錯誤。
4) 使用上面產出的 pg_dump 指令在個別 DB 匯出資料
範例輸出
[postgres@now-server ~]$ psql -f ~/dmp_restore_cmds.sql Timing is off. # of Jobs: 3 Dump File Output dir: /tmp New superuser: postgres set_config ------------ 3 (1 row) set_config ------------ /tmp (1 row) set_config ------------ postgres (1 row) ## Data Dump Command nohup pg_dump --data-only -Fd -j 3 --disable-trigger --superuser=postgres --file=/tmp/dmp_edb --dbname=edb 2>&1 & nohup pg_dump --data-only -Fd -j 3 --disable-trigger --superuser=postgres --file=/tmp/dmp_postgres --dbname=postgres 2>&1 & ## Data Restore Command nohup pg_restore --data-only -Fd -j 3 --disable-trigger --superuser=postgres --dbname=edb /tmp/dmp_edb 2>&1 & nohup pg_restore --data-only -Fd -j 3 --disable-trigger --superuser=postgres --dbname=postgres /tmp/dmp_postgres 2>&1 & [postgres@now-server ~]$
5) 將資料搬移到新環境
如果上面的 Script 用了 host 的選項(這邊註解掉沒啟用),就可以直接在新環境執行
資料匯入
1) 初始化需要的資料庫&設定[root@new-server ~]# /usr/pgsql-12/bin/postgresql-12-setup initdb [root@new-server ~]# service postgresql-12 start
2) 匯入 DDL
執行上面產生的 DDL Script
[postgres@new-server ~]$ psql -f ~/dumpall_ddl.sql
參考
沒有留言:
張貼留言