PostgreSQL數據庫提供了類似Oracle的standby數據庫的功能,。PostgreSQL9.0 standby數據庫在應用WAL日志的同時,也可以提供只讀服務,,這是PostgreSQL9.0中最激動人心的功能,,這個功能在oracle數據庫中也只是最新版本11g中才有的新功能。這個功能在oracle中叫active dataguard,,在PostgreSQL中稱為hot standby,。在利用日志恢復數據的同時可以用只讀的方式打開數據庫,用戶可以在備用數據庫上進行查詢,、報表等操作,,也可用做讀寫分離。在PostgreSQL9.0之前,,也可以搭建standby數據庫,,但standby數據庫只能處于恢復狀態(tài)中,不能打開,,也不支持只讀打開,。而這種情況在9.0之后徹底改變了。 PostgreSQL 9.0中日志傳送的方法有兩種:
基于文件(base-file)的傳送方式在PostgreSQL8.X中就有的方式,,這里不就介紹了,,這里主要介紹流復制的standby的搭建方法,設置步驟如下: 1. 對主數據庫做一個基礎備份,,然后把基礎備份拷貝到standby機器,,把基礎備份恢復到standby機器上 2. 在主庫上設置wal_level = hot_standby。 3. 在主數據庫上設置wal_keep_segments為一個足夠大的值,,以防止主庫生成WAL日志太快,,日志還沒有來得及傳送到standby,就會循環(huán)覆蓋了,; 4. 在主數據庫上設置max_wal_sender參數,,這個參數是控制主庫可以最多有多少個并發(fā)的standby數據庫; 5. 在主數據庫上建一個超級用戶,,standby數據庫會使用這個用戶連接到主庫上拖WAL日志,。 6. 在主數據庫上的pg_hba.conf中設置listen_addresses和連接驗證選項,允許standby數據庫連接到主庫上來拖WAL日志數據,,如下所示: # TYPE DATABASE USER CIDR-ADDRESS METHOD host replication repl 192.168.1.100/32 md5 其中數據庫名必須填“replication”,, 這是一個為standby連接使用了一個虛擬的數據庫名稱。用戶repl就是步驟4上給standby連接使用的在主庫上建的一個超級用戶,。192.168.1.100就是standby數據庫的IP地址,。 7. 在備份數據庫上建一個recovery.conf,設置以下幾項: standby_mode = 'on' primary_conninfo = 'host=127.0.0.1 port=5432 user=repl password=replpwd' trigger_file = '/opt/pgstb/trigger_activestandby' standby_mode設置為'on',,表明數據庫恢復完成后,,不會被找開,仍然處理等待日志的模式,。 primary_conninfo上standby連接到主數據庫所需要的連接串,。 8. 啟動standby數據庫,這樣standby數據庫就算搭建好了,。 下面以實際的例子,,為看standby上如何搭建的,我把standby數據庫與主數據庫建在一臺機器上,。 主數據庫的數據目錄為:/opt/pgpri,,standby數據庫的數據目錄為/opt/pgstb。 為了便于啟動和停止PostgreSQL,,在.bash_profile文件中添加以下兩行: alias pgstart='pg_ctl -D $PGDATA start' alias pgstop='pg_ctl kill INT `head -1 $PGDATA/postmaster.pid`' 在主數據庫的/opt/pgpri/postgresql.conf文件中設置如下配置項: wal_level = hot_standby max_wal_senders = 2 wal_keep_segments = 32 在主數據庫中的/opt/pgpri/pg_hba.conf中添加如下配置: host replication repl 127.0.0.1/32 md5 在數據庫中建一個repl用戶用于給standby連接主庫使用: #psql -d postgres postgres=# create user repl superuser password 'replpwd'; CREATE ROLE 重新啟動主數據庫,,讓配置生效: osdba@osdba-laptop:/opt/pgpri$ pgstop LOG: received fast shutdown request LOG: aborting any active transactions LOG: autovacuum launcher shutting down osdba@osdba-laptop:/opt/pgpri$ LOG: shutting down LOG: database system is shut down osdba@osdba-laptop:/opt/pgpri$ pgstart server starting osdba@osdba-laptop:/opt/pgpri$ LOG: database system was shut down at 2010-08-21 22:33:29 CST LOG: database system is ready to accept connections LOG: autovacuum launcher started 對主數據庫做一個基礎備份: 先用select pg_start_backup();命令把數據庫切換到備份狀態(tài): osdba@osdba-laptop:/opt/pgpri$ psql -d postgres psql (9.0beta4) Type "help" for help. postgres=# SELECT pg_start_backup('/opt/pgstb'); pg_start_backup ----------------- 0/1000020 (1 row) postgres=# 由于我的standby數據庫與主庫在一臺機器上,這時只需要把主數據庫目錄拷貝到備庫目錄就可以了: osdba@osdba-laptop:/opt$ cp -r pgpri/* pgstb/. osdba@osdba-laptop:/opt$ cd pgstb/. osdba@osdba-laptop:/opt/pgstb$ ls backup_label global pg_hba.conf pg_multixact pg_stat_tmp pg_tblspc PG_VERSION postgresql.conf postmaster.pid base pg_clog pg_ident.conf pg_notify pg_subtrans pg_twophase pg_xlog postmaster.opts 拷貝完成后,,結束主庫的備份狀態(tài): postgres=# SELECT pg_stop_backup(); NOTICE: WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup pg_stop_backup ---------------- 0/1000288 (1 row) 修改備庫的配置文件/opt/pgstb/postgresql.conf文件中的相關項為如下內容: port = 5433 hot_standby = on 由于備庫與主庫在同一臺機器上,,給備份指定一個不同的監(jiān)聽端口,這里修改為5433,,主庫是默認的5432端口,,把其中的hot_standby設置為on,。 拷貝示例文件/usr/local/pgsql/share/recovery.conf.sample到/opt/pgstb目錄下,然后改名成recovery.conf,,修改相關的配置項為如下內容: standby_mode = 'on' primary_conninfo = 'host=127.0.0.1 port=5432 user=repl password=replpwd' trigger_file = '/opt/pgstb/trigger_activestb' 刪除原先從主庫上過來的/opt/pgstb/postmaster.pid文件,,然后啟動備庫: osdba@osdba-laptop:/opt/pgstb$ rm postmaster.pid osdba@osdba-laptop:/opt/pgstb$ export PGDATA=/opt/pgstb osdba@osdba-laptop:/opt/pgstb$ echo $PGDATA /opt/pgstb osdba@osdba-laptop:/opt/pgstb$ pgstart server starting osdba@osdba-laptop:/opt/pgstb$ LOG: database system was interrupted; last known up at 2010-08-21 22:43:04 CST LOG: entering standby mode LOG: redo starts at 0/1000020 LOG: record with zero length at 0/10000B0 LOG: streaming replication successfully connected to primary LOG: consistent recovery state reached at 0/2000000 LOG: database system is ready to accept read only connections 這時可以看到備庫已經可以接受只讀連接了。 在主庫上做一些操作: osdba@osdba-laptop:/opt/pgstb$ psql -p 5432 -d postgres psql (9.0beta4) Type "help" for help. postgres=# create table t (id int primary key,name varchar(20)); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "t_pkey" for table "t" CREATE TABLE postgres=# insert into t (1,'xxxxxxx'); ERROR: syntax error at or near "1" at character 16 STATEMENT: insert into t (1,'xxxxxxx'); ERROR: syntax error at or near "1" LINE 1: insert into t (1,'xxxxxxx'); ^ postgres=# insert into t values (1,'xxxxxxx'); INSERT 0 1 postgres=# insert into t values (2,'xxxxxxx'); INSERT 0 1 postgres=# 然后在備庫上看是否同步到了備庫: osdba@osdba-laptop:/opt/pgstb$ psql -p 5433 -d postgres psql (9.0beta4) Type "help" for help. postgres=# \d List of relations Schema | Name | Type | Owner --------+------+-------+------- public | t | table | osdba (1 row) postgres=# select * from t; id | name ----+--------- 1 | xxxxxxx 2 | xxxxxxx (2 rows) 可以看到數據已經同步到了備庫,,基本上感覺不到延遲 |
|
來自: 用勿龍潛 > 《postgreSQL》