久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

PostgreSQL9.0 standby數據庫介紹及搭建方法

 用勿龍潛 2012-01-11
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)的傳送方式,,這種方式是PostgreSQL9.0之前就提供的方法,。也就是服務器寫完一個WAL日志文件后,才把WAL日志文件拷貝到standby數據庫上去應用,。
  • 流復制(streaming replication)的方法,,這是PostgreSQL9.0才提供的新方法。這個方法就是事務提交后,,就異步的把生成的日志傳送到standby數據庫上應用,這比基本文件的日志傳送方法有更低的數據延遲,。

    基于文件(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)

可以看到數據已經同步到了備庫,,基本上感覺不到延遲

    本站是提供個人知識管理的網絡存儲空間,,所有內容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內容中的聯系方式,、誘導購買等信息,謹防詐騙,。如發(fā)現有害或侵權內容,,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多