Slony-Iのレプリケーション設定を行った後、
レプリケーション機能を稼働させたままレプリケーション中のDBへテーブルを追加する手順です。
レプリケーション中のDB名は「master」。
「master」DBにはtable1,table2,table3があり、既にレプリケーション済。
で、そこへtable4を追加します。
サーバー構成
以下のように想定します。
OS | IPアドレス | DB名 | PostgreSQL | Slony-Iバージョン | |
---|---|---|---|---|---|
DBマスターサーバー | CentOS 5.4 64bit | 10.0.0.1 | master | PostgreSQL 8.4.5 | Slony-I 2.0.6 |
DBスレーブサーバー | CentOS 5.4 64bit | 10.0.0.2 | slave | PostgreSQL 9.0.3 | Slony-I 2.0.6 |
現在(テーブル追加前)のレプリケーションの設定です。
master=# SELECT * FROM _slony_test.sl_table; tab_id | tab_reloid | tab_relname | tab_nspname | tab_set | tab_idxname | tab_altered | tab_comment --------+------------+-------------+-------------+---------+-------------+-------------+------------- 1 | 78127 | table1 | public | 1 | table1_pkey | f | table1 2 | 78132 | table2 | public | 1 | table2_pkey | f | table2 3 | 78137 | table3 | public | 1 | table3_pkey | f | table3 (3 rows) master=# SELECT * FROM _slony_test.sl_subscribe; sub_set | sub_provider | sub_receiver | sub_forward | sub_active ---------+--------------+--------------+-------------+------------ 1 | 1 | 2 | f | t (1 row)
マスターサーバー
以下スクリプトを実行します。
#!/bin/sh CLUSTERNAME=slony_test DB1=master DB2=slave HOST1=10.0.0.1 HOST2=10.0.0.2 RUSER=postgres slonik <<_EOF_ cluster name = $CLUSTERNAME; node 1 admin conninfo = 'dbname=$DB1 host=$HOST1 user=$RUSER'; node 2 admin conninfo = 'dbname=$DB2 host=$HOST2 user=$RUSER'; create set (id=2, origin=1, comment='Add table4'); set add table (set id=2, origin=1, id=4, fully qualified name = 'public.table4', comment='table4'); _EOF_
id=2は既存の「tab_set」の1と重複しないよう「tab_set」値を設定しています。
id=4は既存の「tab_id」とは重複しない「tab_id」値をしています。
スレーブサーバー
以下スクリプトを実行します。
#!/bin/sh CLUSTERNAME=slony_test DB1=master DB2=slave HOST1=10.0.0.1 HOST2=10.0.0.2 RUSER=postgres slonik <<_EOF_ cluster name = $CLUSTERNAME; node 1 admin conninfo = 'dbname=$DB1 host=$HOST1 user=$RUSER'; node 2 admin conninfo = 'dbname=$DB2 host=$HOST2 user=$RUSER'; subscribe set ( id = 2, provider = 1, receiver = 2, forward = no); _EOF_
id = 2はマスターサーバーで設定した「tab_set」値にしています。
ここでレプリケーションは開始されます。
この時点(マージ前)でのレプリケーションの状態です。
master=# SELECT * FROM _slony_test.sl_table; tab_id | tab_reloid | tab_relname | tab_nspname | tab_set | tab_idxname | tab_altered | tab_comment --------+------------+-------------+-------------+---------+-------------+-------------+------------- 1 | 78127 | table1 | public | 1 | table1_pkey | f | table1 2 | 78132 | table2 | public | 1 | table2_pkey | f | table2 3 | 78137 | table3 | public | 1 | table3_pkey | f | table3 4 | 78157 | table4 | public | 2 | table4_pkey | f | table4 (4 rows) master=# SELECT * FROM _slony_test.sl_subscribe; sub_set | sub_provider | sub_receiver | sub_forward | sub_active ---------+--------------+--------------+-------------+------------ 1 | 1 | 2 | f | t 2 | 1 | 2 | f | t (2 rows)
マスターサーバーでマージ
#!/bin/sh CLUSTERNAME=slony_test DB1=master DB2=slave HOST1=10.0.0.1 HOST2=10.0.0.2 RUSER=postgres slonik <<_EOF_ cluster name = $CLUSTERNAME; node 1 admin conninfo = 'dbname=$DB1 host=$HOST1 user=$RUSER'; node 2 admin conninfo = 'dbname=$DB2 host=$HOST2 user=$RUSER'; merge set (id = 1 , add id = 2 ,origin = 1) ; _EOF_
add id = 2は追加したテーブルの「tab_set」です。
マージ後のレプリケーション状態です。
master=# SELECT * FROM _slony_test.sl_table; tab_id | tab_reloid | tab_relname | tab_nspname | tab_set | tab_idxname | tab_altered | tab_comment --------+------------+-------------+-------------+---------+-------------+-------------+------------- 1 | 78127 | table1 | public | 1 | table1_pkey | f | table1 2 | 78132 | table2 | public | 1 | table2_pkey | f | table2 3 | 78137 | table3 | public | 1 | table3_pkey | f | table3 4 | 78157 | table4 | public | 1 | table4_pkey | f | table4 (4 rows) master=# SELECT * FROM _slony_test.sl_subscribe; sub_set | sub_provider | sub_receiver | sub_forward | sub_active ---------+--------------+--------------+-------------+------------ 1 | 1 | 2 | f | t (1 rows)
うまくテーブル追加とマージが出来ました。