PostGreSql12.6的備份恢復
PostGreSql 12.6 的備份和恢復
備份和恢復支援如下幾種方式:
1. SQL轉儲
2. 檔案系統級別備份
3. 連續歸檔和時間點恢復(PITR)
一、SQL轉儲
1.1 pg_dump
[postgres@localhost bin]$ ./pg_dump -d mydb -f /home/postgres/mydb.dump ##全庫備份 dbname 是 mydb
[postgres@localhost bin]$ ./pg_dump -d mydb -t weather -f /home/postgres/weather.dump ##表備份, mydb 資料庫下的表 weather
[postgres@localhost bin]$ ./dropdb mydb
[postgres@localhost bin]$ ./psql -U postgres -d postgres -h 192.168.56.10 -p 543 2
使用者 postgres 的口令:
psql (12.6)
輸入 "help" 來獲取幫助資訊.
postgres=# \l
資料庫列表
名稱 | 擁有者 | 字元編碼 | 校對規則 | Ctype | 存取許可權
-----------+----------+----------+-------------+-------------+------------------
-----
postgres | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 |
template0 | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/postgres
+
| | | | | postgres=CTc/post
gres
template1 | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/postgres
+
| | | | | postgres=CTc/post
gres
(3 行記錄)
## mydb不存在了
postgres=# \q
[postgres@localhost bin]$ ./createdb mydb
[postgres@localhost bin]$ ./psql -U postgres -d postgres -h 192.168.56.10 -p 543 2
使用者 postgres 的口令:
psql (12.6)
輸入 "help" 來獲取幫助資訊.
postgres=# \l
資料庫列表
名稱 | 擁有者 | 字元編碼 | 校對規則 | Ctype | 存取許可權
-----------+----------+----------+-------------+-------------+------------------
-----
mydb | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 |
postgres | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 |
template0 | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/postgres
+
| | | | | postgres=CTc/post
gres
template1 | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/postgres
+
| | | | | postgres=CTc/post
gres
(4 行記錄)
postgres=# \c mydb
您現在已經連線到資料庫 "mydb",使用者 "postgres".
mydb=# \d
沒有找到任何關係.
mydb=# \q
##重建DB,但是沒有資料
[postgres@localhost bin]$ ./psql -d mydb -f /home/postgres/mydb.dump
SET
SET
SET
SET
SET
set_config
------------
(1 行記錄)
SET
SET
SET
SET
SET
SET
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE VIEW
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE VIEW
ALTER TABLE
COPY 0
COPY 1
COPY 0
COPY 3
[postgres@localhost bin]$ ./psql -U postgres -d postgres -h 192.168.56.10 -p 543 2
使用者 postgres 的口令:
psql (12.6)
輸入 "help" 來獲取幫助資訊.
postgres=# \c
您現在已經連線到資料庫 "postgres",使用者 "postgres".
postgres=# \c mydb
您現在已經連線到資料庫 "mydb",使用者 "postgres".
mydb=# \d
關聯列表
架構模式 | 名稱 | 型別 | 擁有者
----------+--------------+--------+----------
public | capitals | 資料表 | postgres
public | cities | 資料表 | postgres
public | cities01 | 檢視 | postgres
public | myview | 檢視 | postgres
public | non_capitals | 資料表 | postgres
public | weather | 資料表 | postgres
(6 行記錄)
###資料表恢復了
1.2 pg_dumpall
##全庫備份
[postgres@localhost bin]$ ./pg_dumpall > /home/postgres/pg_all.dump
[postgres@localhost bin]$ ./dropdb mydb
[postgres@localhost bin]$ ./dropdb mydb01
[postgres@localhost bin]$ ./psql -U postgres -d postgres -h 192.168.56.10 -p 543 2
使用者 postgres 的口令:
psql (12.6)
輸入 "help" 來獲取幫助資訊.
postgres=# \l
資料庫列表
名稱 | 擁有者 | 字元編碼 | 校對規則 | Ctype | 存取許可權
-----------+----------+----------+-------------+-------------+------------------
-----
postgres | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 |
template0 | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/postgres
+
| | | | | postgres=CTc/post
gres
template1 | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/postgres
+
| | | | | postgres=CTc/post
gres
(3 行記錄)
##mydb 和 mydb01 不存在了
postgres=# \q
[postgres@localhost bin]$ ./psql -f /home/postgres/pg_all.dump
[postgres@localhost bin]$ ./psql -U postgres -d postgres -h 192.168.56.10 -p 5432
使用者 postgres 的口令:
psql (12.6)
輸入 "help" 來獲取幫助資訊.
postgres=# \l
資料庫列表
名稱 | 擁有者 | 字元編碼 | 校對規則 | Ctype | 存取許可權
-----------+----------+----------+-------------+-------------+-----------------------
mydb | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 |
mydb01 | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 |
postgres | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 |
template0 | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(5 行記錄)
postgres=# \c mydb01
您現在已經連線到資料庫 "mydb01",使用者 "postgres".
mydb01=# \d
關聯列表
架構模式 | 名稱 | 型別 | 擁有者
----------+--------------+--------+----------
public | capitals | 資料表 | postgres
public | cities | 資料表 | postgres
public | cities01 | 檢視 | postgres
public | myview | 檢視 | postgres
public | non_capitals | 資料表 | postgres
public | weather | 資料表 | postgres
(6 行記錄)
mydb01=# select * from weather;
city | temp_lo | temp_hi | prcp | date
---------------+---------+---------+------+------------
San Francisco | 46 | 50 | 0.25 | 1994-11-27
San Francisco | 41 | 55 | 0 | 1994-11-29
Hayward | 35 | 52 | | 1994-11-29
(3 行記錄)
##恢復之後,表、資料都恢復了
1.3 壓縮和分割
主要是利用Linux的管線命令實現備份檔案的壓縮與分割。
[postgres@localhost bin]$ ./pg_dumpall | gzip > /home/postgres/pg_all.gz
[postgres@localhost bin]$ ls -al /home/postgres/
總用量 52
drwx------. 2 postgres postgres 4096 4月 13 07:18 .
drwxr-xr-x. 4 root root 39 4月 12 15:26 ..
-rw-------. 1 postgres postgres 1400 4月 12 17:43 .bash_history
-rw-r--r--. 1 postgres postgres 18 9月 7 2017 .bash_logout
-rw-r--r--. 1 postgres postgres 211 4月 12 17:43 .bash_profile
-rw-r--r--. 1 postgres postgres 231 9月 7 2017 .bashrc
-rw-rw-r--. 1 postgres postgres 2938 4月 13 06:05 mydb.dump
-rw-rw-r--. 1 postgres postgres 10854 4月 13 07:10 pg_all.dump
-rw-rw-r--. 1 postgres postgres 1328 4月 13 07:18 pg_all.gz
-rw-------. 1 postgres postgres 3537 4月 13 07:17 .psql_history
-rw-rw-r--. 1 postgres postgres 292 4月 12 16:04 t01.txt
-rw-rw-r--. 1 postgres postgres 1070 4月 13 06:06 weather.dump
[postgres@localhost bin]$ ./pg_dumpall | split -b 10k - /home/postgres/pg_all01.dump ##測試沒有資料, 10k一個檔案
[postgres@localhost bin]$ ls -al /home/postgres/
總用量 68
drwx------. 2 postgres postgres 4096 4月 13 07:32 .
drwxr-xr-x. 4 root root 39 4月 12 15:26 ..
-rw-------. 1 postgres postgres 1400 4月 12 17:43 .bash_history
-rw-r--r--. 1 postgres postgres 18 9月 7 2017 .bash_logout
-rw-r--r--. 1 postgres postgres 211 4月 12 17:43 .bash_profile
-rw-r--r--. 1 postgres postgres 231 9月 7 2017 .bashrc
-rw-rw-r--. 1 postgres postgres 2938 4月 13 06:05 mydb.dump
-rw-rw-r--. 1 postgres postgres 10240 4月 13 07:32 pg_all01.dumpaa
-rw-rw-r--. 1 postgres postgres 735 4月 13 07:32 pg_all01.dumpab
-rw-rw-r--. 1 postgres postgres 10854 4月 13 07:10 pg_all.dump
-rw-rw-r--. 1 postgres postgres 1328 4月 13 07:18 pg_all.gz
-rw-------. 1 postgres postgres 3537 4月 13 07:17 .psql_history
-rw-rw-r--. 1 postgres postgres 292 4月 12 16:04 t01.txt
[postgres@localhost bin]$ ./dropdb mydb01
[postgres@localhost bin]$ ./dropdb mydb
[postgres@localhost bin]$ ./psql -U postgres -d postgres -h 192.168.56.10 -p 5432
[postgres@localhost bin]$ cat /home/postgres/pg_all01.dump* | psql
[postgres@localhost bin]$ ./dropdb mydb
[postgres@localhost bin]$ ./dropdb mydb01
[postgres@localhost bin]$ gunzip -c /home/postgres/pg_all.gz | psql
二、檔案系統級別備份
冷備了,停機之後複製對應的檔案,一般是有重大升級、遷移前會做一次,一般不會這樣操作。
三、連續歸檔和時間點恢復
熱備了,在系統工作的時候,開啟歸檔,進行資料的備份,需要恢復的時候,先回復基礎備份,之後再透過歸檔檔案做前滾操作,恢復資料到發生事故前的狀態。
3.1 啟用歸檔
[postgres@localhost ~]$ cat /var/lib/pgsql/12/data/postgresql.conf
archive_mode = on # enables archiving; off, on, or always
# (change requires restart)
archive_command = 'test ! -f /home/postgres/arc/%f && cp %p /home/postgres/arc/%f'
# command to use to archive a logfile segment
# placeholders: %p = path of file to archive
# %f = file name only
# e.g. 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedi
[postgres@localhost bin]$ ./pg_ctl status -D /var/lib/pgsql/12/data
pg_ctl: 正在執行伺服器程式(PID: 2024)
/usr/pgsql-12/bin/postgres "-D" "/var/lib/pgsql/12/data"
[postgres@localhost bin]$ ./pg_ctl restart -D /var/lib/pgsql/12/data
等待伺服器程式關閉 .... 完成
伺服器程式已經關閉
等待伺服器程式啟動 ....2021-04-13 08:04:31.954 CST [4872] 日誌: 正在啟動 PostgreSQL 12.6 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit
2021-04-13 08:04:31.954 CST [4872] 日誌: 正在監聽IPv4地址"0.0.0.0",埠 5432
2021-04-13 08:04:31.954 CST [4872] 日誌: 正在監聽IPv6地址"::",埠 5432
2021-04-13 08:04:31.956 CST [4872] 日誌: 在Unix套接字 "/var/run/postgresql/.s.PGSQL.5432"上偵聽
2021-04-13 08:04:31.960 CST [4872] 日誌: 在Unix套接字 "/tmp/.s.PGSQL.5432"上偵聽
2021-04-13 08:04:31.964 CST [4872] 日誌: 日誌輸出重定向到日誌收集程式
2021-04-13 08:04:31.964 CST [4872] 提示: 後續的日誌輸出將出現在目錄 "log"中.完成
伺服器程式已經啟動
[postgres@localhost bin]$ ps -ef|grep postgres:|grep -v grep
postgres 4873 4872 0 08:04 ? 00:00:00 postgres: logger
postgres 4875 4872 0 08:04 ? 00:00:00 postgres: checkpointer
postgres 4876 4872 0 08:04 ? 00:00:00 postgres: background writer
postgres 4877 4872 0 08:04 ? 00:00:00 postgres: walwriter
postgres 4878 4872 0 08:04 ? 00:00:00 postgres: autovacuum launcher
postgres 4879 4872 0 08:04 ? 00:00:00 postgres: archiver last was 000000010000000000000003
postgres 4880 4872 0 08:04 ? 00:00:00 postgres: stats collector
postgres 4881 4872 0 08:04 ? 00:00:00 postgres: logical replication launcher
postgres 4969 4872 0 08:08 ? 00:00:00 postgres: postgres postgres 192.168.56.10(40860) idle
[postgres@localhost bin]$ ./psql -U postgres -d postgres -h 192.168.56.10 -p 5432
使用者 postgres 的口令:
psql (12.6)
輸入 "help" 來獲取幫助資訊.
postgres=# select pg_switch_wal();
pg_switch_wal
---------------
0/18EC338
(1 行記錄)
## 如果在 /var/lib/pgsql/12/data/pg_wal 和 /home/postgres/arc/ 產生新的歸檔檔案,設定就成功了。
3.2 開始備份
[postgres@localhost 12]$ touch /var/lib/pgsql/backup_in_progress
[postgres@localhost 12]$ psql -c "select pg_start_backup('hot_backup');"
pg_start_backup
-----------------
0/20000028
(1 行記錄)
[postgres@localhost 12]$ tar -Pcvf /var/lib/pgsql/12/backup.tar.gz /var/lib/pgsql/12/data/
[postgres@localhost 12]$ psql -c "select pg_stop_backup();"
注意: 所有需要的WAL段都已經歸檔完成
pg_stop_backup
----------------
0/20000138
(1 行記錄)
[postgres@localhost 12]$ rm /var/lib/pgsql/backup_in_progress
[postgres@localhost 12]$ tar -Prf /var/lib/pgsql/12/backup.tar.gz /var/lib/pgsql/12/archive/
[postgres@localhost 12]$ ls -al
總用量 124556
drwx------. 6 postgres postgres 4096 4月 13 19:13 .
drwx------. 3 postgres postgres 35 4月 13 19:13 ..
drwxrwxr-x. 2 postgres postgres 6 4月 13 10:54 archive
drwx------. 2 postgres postgres 6 2月 11 09:16 backups
-rw-rw-r--. 1 postgres postgres 127528960 4月 13 19:14 backup.tar.gz
可以做成一個指令碼:
##******
touch /var/lib/pgsql/backup_in_progress
psql -c "select pg_start_backup('hot_backup');"
cd /var/lib/pgsql/12/
tar -Pcvf /var/lib/pgsql/12/backup.tar.gz /var/lib/pgsql/12/data/
psql -c "select pg_stop_backup();"
rm /var/lib/pgsql/backup_in_progress
tar -Prf /var/lib/pgsql/12/backup.tar.gz /var/lib/pgsql/12/archive/
##******
備份後的操作
mydb=# alter table weather rename to weather09;
ALTER TABLE
mydb=# \d
關聯列表
架構模式 | 名稱 | 型別 | 擁有者
----------+-----------+--------+----------
public | weather01 | 資料表 | postgres
public | weather09 | 資料表 | postgres
(2 行記錄)
mydb=# \i /home/postgres/weather.dump
mydb=# \d
關聯列表
架構模式 | 名稱 | 型別 | 擁有者
----------+-----------+--------+----------
public | weather | 資料表 | postgres
public | weather01 | 資料表 | postgres
public | weather09 | 資料表 | postgres
(3 行記錄)
mydb=# select pg_switch_wal();
pg_switch_wal
---------------
0/21025C90
(1 行記錄)
3.3 恢復測試
[postgres@localhost ~]$ pg_ctl stop -D /var/lib/pgsql/12/data
等待伺服器程式關閉 .... 完成
伺服器程式已經關閉
[postgres@localhost 12]$ mv data data.new.bak
[postgres@localhost 12]$ tar -Pxvf backup.tar.gz -C /
[postgres@localhost 12]$ ls -al
總用量 124560
drwx------. 7 postgres postgres 4096 4月 13 19:39 .
drwx------. 3 postgres postgres 35 4月 13 19:13 ..
drwxrwxr-x. 2 postgres postgres 6 4月 13 10:54 archive
drwx------. 2 postgres postgres 6 2月 11 09:16 backups
-rw-rw-r--. 1 postgres postgres 127528960 4月 13 19:14 backup.tar.gz
drwx------. 20 postgres postgres 4096 4月 13 19:13 data
drwx------. 20 postgres postgres 4096 4月 13 12:16 data01.bak
drwx------. 20 postgres postgres 4096 4月 13 19:38 data.new.bak
-rw-------. 1 postgres postgres 997 4月 12 15:32 initdb.log
修改恢復引數:
[postgres@localhost log]$ cat /var/lib/pgsql/12/data/postgresql.conf
restore_command = 'cp /home/postgres/arc/%f %p'
# command to use to restore an archived logfile segment
# placeholders: %p = path of file to restore
# %f = file name only
# e.g. 'cp /mnt/server/archivedir/%f %p'
# (change requires restart)
recovery_target_time = '2021-04-13 19:43:16' ##操作的當前時間
[postgres@localhost data]$ touch /var/lib/pgsql/12/data/recovery.signal ##pg12之後使用這個標識檔案了,空的檔案就可以
[postgres@localhost data]$ pg_ctl start -D /var/lib/pgsql/12/data
等待伺服器程式啟動 ....2021-04-13 19:47:53.898 CST [9681] 日誌: 正在啟動 PostgreSQL 12.6 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit
2021-04-13 19:47:53.898 CST [9681] 日誌: 正在監聽IPv4地址"0.0.0.0",埠 5432
2021-04-13 19:47:53.898 CST [9681] 日誌: 正在監聽IPv6地址"::",埠 5432
2021-04-13 19:47:53.900 CST [9681] 日誌: 在Unix套接字 "/var/run/postgresql/.s.PGSQL.5432"上偵聽
2021-04-13 19:47:53.904 CST [9681] 日誌: 在Unix套接字 "/tmp/.s.PGSQL.5432"上偵聽
2021-04-13 19:47:53.908 CST [9681] 日誌: 日誌輸出重定向到日誌收集程式
2021-04-13 19:47:53.908 CST [9681] 提示: 後續的日誌輸出將出現在目錄 "log"中.. 完成
伺服器程式已經啟動
[postgres@localhost log]$ psql -U postgres -d postgres -h 192.168.56.10 -p 5432
使用者 postgres 的口令:
psql (12.6)
輸入 "help" 來獲取幫助資訊.
postgres=# \c
您現在已經連線到資料庫 "postgres",使用者 "postgres".
postgres=# \c mydb
您現在已經連線到資料庫 "mydb",使用者 "postgres".
mydb=# \d
關聯列表
架構模式 | 名稱 | 型別 | 擁有者
----------+-----------+--------+----------
public | weather | 資料表 | postgres
public | weather01 | 資料表 | postgres
public | weather09 | 資料表 | postgres
(3 行記錄)
mydb=# \d weather09
資料表 "public.weather09"
欄位 | 型別 | 校對規則 | 可空的 | 預設
---------+-----------------------+----------+--------+------
city | character varying(80) | | |
temp_lo | integer | | |
temp_hi | integer | | |
prcp | real | | |
date | date | | |
mydb=# insert into weather09 values('Dalian',50,60,0.75,'1994-11-27');
INSERT 0 1
mydb=# select * from weather09;
city | temp_lo | temp_hi | prcp | date
---------------+---------+---------+------+------------
San Francisco | 46 | 50 | 0.25 | 1994-11-27
San Francisco | 41 | 55 | 0 | 1994-11-29
Hayward | 35 | 52 | | 1994-11-29
Dalian | 50 | 60 | 0.75 | 1994-11-27
(4 行記錄)
##備份之後的操作結果也存在恢復的資料裡面了。 資料表也可以insert shuju。
基本的一個操作記錄,備查吧。。。。。。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/6126/viewspace-2767932/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- RAC備份恢復之Voting備份與恢復
- 備份與恢復:polardb資料庫備份與恢復資料庫
- MySQL備份與恢復——基於Xtrabackup物理備份恢復MySql
- mydumper備份恢復
- Mysql備份恢復MySql
- 備份和恢復
- DB的備份與恢復
- GitLab的備份與恢復Gitlab
- 詳解叢集級備份恢復:物理細粒度備份恢復
- MySQL備份與恢復——基於MyDumper/MyLoader 邏輯備份恢復MySql
- GitLab的自動備份、清理備份與恢復Gitlab
- Mysql備份與恢復(1)---物理備份MySql
- rman 增量備份恢復
- Jenkins備份與恢復Jenkins
- Postgresql 備份與恢復SQL
- MySQL 備份與恢復MySql
- KunlunDB備份和恢復
- RMAN備份恢復技巧
- redis 備份和恢復Redis
- Grafana 備份恢復教程Grafana
- 【PG備份恢復】pg_basebackup 多表空間備份恢復測試
- MySQL備份與恢復——基於OUTFILE /LOAD DATA 邏輯備份恢復MySql
- Linux 系統的備份恢復Linux
- MySQL 非常規恢復與物理備份恢復MySql
- Mysql備份與恢復(2)---邏輯備份MySql
- SqlServer備份和恢復(二)SQLServer
- Oracle 備份 與 恢復 概述Oracle
- Oracle 備份恢復之 FlashbackOracle
- SqlServer 備份和恢復(一)SQLServer
- 【MySQL】MySQL備份和恢復MySql
- ORACLE備份&恢復案例(轉)Oracle
- 資料庫備份恢復資料庫
- RMAN備份異機恢復
- tore 命令來恢復備份
- 賦能雲HBase備份恢復 百T級別資料量備份恢復支援
- 從dataguard備份的恢復機制
- Mysql的幾種備份與恢復MySql
- Elasticsearch叢集的備份與恢復Elasticsearch