クラスタ+レプリケーション(レプリケーション先もクラスタ)

 

(8.0.27)
OS: CentOS7
メモリ2G/ディスク60G


https://blog.s-style.co.jp/2021/11/8297/
https://dev.mysql.com/doc/mysql-shell/8.0/en/innodb-clusterset.html
https://www.mysql.com/jp/why-mysql/presentations/mysql-innodb-clusterset-doc-jp/


InnoDB cluster と binlog_replicationの組み合わせや、InnoDB clusterと InnoDB ReplicaSetの組み合わせはサポートされていない模様のため、
8.0.27からの新機能である InnoDB ClusterSet を使用する

プライマリサイト
mmm121 mysql_router mysql_shell
mmm122 node1
mmm123 node2
mmm124 node3

DRサイト
mmm125 mysql_router mysql_shell
mmm126 node1
mmm127 node2
mmm128 node3

 


-- 1. リポジトリインストール[mmm121,mmm122,mmm123,mmm124,mmm125,mmm126,mmm127,mmm128]

yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm


-- 2. MySQL Shell のセットアップ[mmm121,mmm125]

python -V
yum install -y mysql-shell

-- 3. MySQL のインストール[mmm122,mmm123,mmm124,mmm126,mmm127,mmm128]

yum install -y mysql-community-server
systemctl start mysqld
systemctl status mysqld
mysql -u root -p`grep 'temporary password' /var/log/mysqld.log | awk -e '{print $13}'`

ALTER USER root@localhost IDENTIFIED BY 'password';

create user 'root'@'%' identified by 'password';
grant all on *.* to 'root'@'%' with grant option;

 

-- 4. MySQL Group Replication の各インスタンスの設定[mmm121]

mysqlsh

dba.checkInstanceConfiguration('root@192.168.137.122')

dba.configureInstance('root@192.168.137.122')
dba.configureInstance('root@192.168.137.123')
dba.configureInstance('root@192.168.137.124')

dba.configureInstance('root@192.168.137.126')
dba.configureInstance('root@192.168.137.127')
dba.configureInstance('root@192.168.137.128')


-- 5. InnoDB ClusterSetの設定[mmm121]

\c root@192.168.137.122

cluster1 = dba.createCluster('cluster1')

cluster1.addInstance('root@192.168.137.123')
cluster1.addInstance('root@192.168.137.124')
cluster1.status()

myclusterset = cluster1.createClusterSet('myclusterset')
myclusterset.status() 

cluster2 = myclusterset.createReplicaCluster('root@192.168.137.126', 'cluster2') 
cluster2.addInstance('root@192.168.137.127')
cluster2.addInstance('root@192.168.137.128')
myclusterset.status()
myclusterset.status({extended: 1})

 


-- 6. MySQL Router のインストール[mmm121,mmm125]
yum install -y mysql-router

-- 7. MySQL Router の初期設定[mmm121]

mysqlrouter --bootstrap root@192.168.137.122 --user=mysqlrouter

systemctl start mysqlrouter
systemctl status mysqlrouter

cat /var/log/mysqlrouter/mysqlrouter.log

mysqlsh --uri root@192.168.137.121:6446 --sql
select @@hostname;

mysqlsh --uri root@192.168.137.121:6447 --sql
select @@hostname;


-- 8. MySQL Router の初期設定[mmm125]

mysqlrouter --bootstrap root@192.168.137.126 --user=mysqlrouter

systemctl start mysqlrouter
systemctl status mysqlrouter

cat /var/log/mysqlrouter/mysqlrouter.log

mysqlsh --uri root@192.168.137.125:6446 --sql
select @@hostname;

mysqlsh --uri root@192.168.137.125:6447 --sql
select @@hostname;


-- 9. フェイルオーバーの動作確認
-- MySQL停止[mmm122,mmm123,mmm124]
systemctl stop mysqld


-- cluster2をプライマリー・クラスターに昇格[mmm125]

mysqlsh --uri root@192.168.137.126:3306

myclusterset=dba.getClusterSet()
myclusterset.status({extended: 1})

myclusterset.forcePrimaryCluster('cluster2') 
myclusterset.status({extended: 1})

 

(19c)
https://blogs.oracle.com/otnjp/post/shibacho-058

RAC + Data Guard


OS: CentOS 7.9

mmm121: プライマリサイト RAC node1 メモリ:8G/ディスク:60G
mmm122: プライマリサイト RAC node2 メモリ:8G/ディスク:60G
mmm123: プライマリサイト iSCSIターゲット メモリ:2G/ディスク:60G + 40G + 40G
mmm124: スタンバイサイト RAC node1 メモリ:8G/ディスク:60G
mmm125: スタンバイサイト RAC node2 メモリ:8G/ディスク:60G
mmm126: スタンバイサイト iSCSIターゲット メモリ:2G/ディスク:60G + 40G + 40G

プライマリサイトSCAN 192.168.137.133
スタンバイサイトSCAN 192.168.137.136

プライマリサイトDB名: moon
スタンバイサイトDB名: moon

プライマリサイトDBユニーク名: moon
スタンバイサイトDBユニーク名: sun

プライマリサイト
mmm121
 eth0 192.168.137.121 eth1 192.168.70.121 vip  192.168.137.131
mmm122
 eth0 192.168.137.122 eth1 192.168.70.122 vip  192.168.137.132
mmm123
 eth0 192.168.137.123
scan
      192.168.137.133

スタンバイサイト
mmm124
 eth0 192.168.137.124 eth1 192.168.70.124 vip  192.168.137.134
mmm125
 eth0 192.168.137.125 eth1 192.168.70.125 vip  192.168.137.135
mmm126
 eth0 192.168.137.126
scan
      192.168.137.136

大文字小文字は以下のとおりとする

:小文字:
SID
DB名
DBユニーク名
インスタンス
サービス名

:大文字:
TNSエイリアス
LOG_ARCHIVE_DEST_3のSERVICE
FAL_CLIENT
FAL_SERVER
ASMのディレクトリ名のDB部分 <==自動で大文字になる模様


--------[1]事前準備--------

-- 1. OS設定[mmm121,mmm122,mmm124,mmm125]

※プライマリサイトとスタンバイサイトのDBノード4台で実施

--1.1 HOSTSファイル設定

vim /etc/hosts
192.168.137.121         mmm121.example.com mmm121
192.168.70.121          mmm121-priv.example.com mmm121-priv
192.168.137.131         mmm121-vip.example.com mmm121-vip

192.168.137.122         mmm122.example.com mmm122
192.168.70.122          mmm122-priv.example.com mmm122-priv
192.168.137.132         mmm122-vip.example.com mmm122-vip

192.168.137.124         mmm124.example.com mmm124
192.168.70.124          mmm124-priv.example.com mmm124-priv
192.168.137.134         mmm124-vip.example.com mmm124-vip

192.168.137.125         mmm125.example.com mmm125
192.168.70.125          mmm125-priv.example.com mmm125-priv
192.168.137.135         mmm125-vip.example.com mmm125

192.168.137.123         mmm123.example.com mmm123
192.168.137.126         mmm126.example.com mmm126

192.168.137.133         mmscan133.example.com mmscan133
192.168.137.136         mmscan136.example.com mmscan136

--1.2 ユーザ設定


groupadd -g 54321 oinstall
groupadd -g 54322 dba
groupadd -g 54323 oper
groupadd -g 54324 backupdba
groupadd -g 54325 dgdba
groupadd -g 54326 kmdba
groupadd -g 54327 racdba
useradd -u 54321 -g oinstall -G dba,oper,backupdba,dgdba,kmdba,racdba oracle
echo oracle | passwd --stdin oracle

groupadd -g 1001 asmadmin
groupadd -g 1002 asmdba
useradd -u 54322 -g oinstall -G asmadmin,asmdba grid
echo grid | passwd --stdin grid


----------------------------------------------
--1.3 preinstall.rpmをCentOS7で使用
https://bismarc256.hateblo.jp/entry/2022/01/18/200000
https://www.intellilink.co.jp/column/oracle/2015/110600.aspx


OL7.9(V1009690-01.iso)をSCP


mount -o ro,loop /root/V1009690-01.iso /mnt

ls /mnt

cd /etc/yum.repos.d
ls

vim /etc/yum.repos.d/ol79.repo

[ol79]
name=Oracle Linux 7.9 x86_64
baseurl=file:///mnt
gpgkey=file:///mnt/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1


yum clean all
yum --disablerepo="*" --enablerepo=ol79 repolist

yum install oracle-database-preinstall-19c -y

umount /mnt
rm -i /root/V1009690-01.iso

----------------------------------------------

 


--1.4 PAM修正

vim /etc/pam.d/login
session required pam_limits.so

--1.5 NTP設定
systemctl enable chronyd.service
systemctl start chronyd.service
systemctl status chronyd.service


--1.6 ディレクトリ作成


mkdir -p /u01/app/oracle
mkdir -p /u01/app/grid
mkdir -p /u01/app/19.0.0/grid
mkdir /u01/app/oraInventory
chown -R grid:oinstall /u01
chown oracle:oinstall /u01/app/oracle
chmod -R 775 /u01

 

--1.7 ユーザ環境設定


vim /home/oracle/.bash_profile

export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export NLS_LANG=Japanese_Japan.AL32UTF8
export PATH=$PATH:$ORACLE_HOME/bin
umask 022

vim /home/grid/.bash_profile

export ORACLE_BASE=/u01/app/grid
export ORACLE_HOME=/u01/app/19.0.0/grid
export NLS_LANG=Japanese_Japan.AL32UTF8
export PATH=$PATH:$ORACLE_HOME/bin
umask 022

 

-- 2. プライマリサイト iSCSIターゲット設定[mmm123]
vim /etc/hosts
192.168.137.121         mmm121.example.com mmm121
192.168.70.121          mmm121-priv.example.com mmm121-priv
192.168.137.131         mmm121-vip.example.com mmm121-vip

192.168.137.122         mmm122.example.com mmm122
192.168.70.122          mmm122-priv.example.com mmm122-priv
192.168.137.132         mmm122-vip.example.com mmm122-vip

192.168.137.124         mmm124.example.com mmm124
192.168.70.124          mmm124-priv.example.com mmm124-priv
192.168.137.134         mmm124-vip.example.com mmm124-vip

192.168.137.125         mmm125.example.com mmm125
192.168.70.125          mmm125-priv.example.com mmm125-priv
192.168.137.135         mmm125-vip.example.com mmm125

192.168.137.123         mmm123.example.com mmm123
192.168.137.126         mmm126.example.com mmm126

192.168.137.133         mmscan133.example.com mmscan133
192.168.137.136         mmscan136.example.com mmscan136

 

fdisk /dev/sdb
fdisk /dev/sdc

yum -y install targetcli

vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1994-05.com.redhat:mmm123

targetcli

/> ls
o- / ....................................................................................... [...]
  o- backstores ............................................................................ [...]
  | o- block ................................................................ [Storage Objects: 2]
  | | o- block0 ....................................... [/dev/sdb1 (40.0GiB) write-thru activated]
  | | | o- alua ................................................................. [ALUA Groups: 1]
  | | |   o- default_tg_pt_gp ..................................... [ALUA state: Active/optimized]
  | | o- block1 ....................................... [/dev/sdc1 (40.0GiB) write-thru activated]
  | |   o- alua ................................................................. [ALUA Groups: 1]
  | |     o- default_tg_pt_gp ..................................... [ALUA state: Active/optimized]
  | o- fileio ............................................................... [Storage Objects: 0]
  | o- pscsi ................................................................ [Storage Objects: 0]
  | o- ramdisk .............................................................. [Storage Objects: 0]
  o- iscsi .......................................................................... [Targets: 1]
  | o- iqn.1994-05.com.redhat:mmm123 ................................................... [TPGs: 1]
  |   o- tpg1 ............................................................. [no-gen-acls, no-auth]
  |     o- acls ........................................................................ [ACLs: 2]
  |     | o- iqn.1994-05.com.redhat:mmm121 ...................................... [Mapped LUNs: 2]
  |     | | o- mapped_lun0 .............................................. [lun0 block/block0 (rw)]
  |     | | o- mapped_lun1 .............................................. [lun1 block/block1 (rw)]
  |     | o- iqn.1994-05.com.redhat:mmm122 ...................................... [Mapped LUNs: 2]
  |     |   o- mapped_lun0 .............................................. [lun0 block/block0 (rw)]
  |     |   o- mapped_lun1 .............................................. [lun1 block/block1 (rw)]
  |     o- luns ........................................................................ [LUNs: 2]
  |     | o- lun0 .................................. [block/block0 (/dev/sdb1) (default_tg_pt_gp)]
  |     | o- lun1 .................................. [block/block1 (/dev/sdc1) (default_tg_pt_gp)]
  |     o- portals .................................................................. [Portals: 1]
  |       o- 192.168.137.123:3260 ........................................................... [OK]
  o- loopback ....................................................................... [Targets: 0]

systemctl enable target
systemctl start target


-- 3. スタンバイサイト iSCSIターゲット設定[mmm126]
vim /etc/hosts
192.168.137.121         mmm121.example.com mmm121
192.168.70.121          mmm121-priv.example.com mmm121-priv
192.168.137.131         mmm121-vip.example.com mmm121-vip

192.168.137.122         mmm122.example.com mmm122
192.168.70.122          mmm122-priv.example.com mmm122-priv
192.168.137.132         mmm122-vip.example.com mmm122-vip

192.168.137.124         mmm124.example.com mmm124
192.168.70.124          mmm124-priv.example.com mmm124-priv
192.168.137.134         mmm124-vip.example.com mmm124-vip

192.168.137.125         mmm125.example.com mmm125
192.168.70.125          mmm125-priv.example.com mmm125-priv
192.168.137.135         mmm125-vip.example.com mmm125

192.168.137.123         mmm123.example.com mmm123
192.168.137.126         mmm126.example.com mmm126

192.168.137.133         mmscan133.example.com mmscan133
192.168.137.136         mmscan136.example.com mmscan136


fdisk /dev/sdb
fdisk /dev/sdc

yum -y install targetcli

vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1994-05.com.redhat:mmm126

targetcli

/> ls
o- / ......................................................................................... [...]
  o- backstores .............................................................................. [...]
  | o- block .................................................................. [Storage Objects: 2]
  | | o- block0 ......................................... [/dev/sdb1 (40.0GiB) write-thru activated]
  | | | o- alua ................................................................... [ALUA Groups: 1]
  | | |   o- default_tg_pt_gp ....................................... [ALUA state: Active/optimized]
  | | o- block1 ......................................... [/dev/sdc1 (40.0GiB) write-thru activated]
  | |   o- alua ................................................................... [ALUA Groups: 1]
  | |     o- default_tg_pt_gp ....................................... [ALUA state: Active/optimized]
  | o- fileio ................................................................. [Storage Objects: 0]
  | o- pscsi .................................................................. [Storage Objects: 0]
  | o- ramdisk ................................................................ [Storage Objects: 0]
  o- iscsi ............................................................................ [Targets: 1]
  | o- iqn.1994-05.com.redhat:mmm126 ..................................................... [TPGs: 1]
  |   o- tpg1 ............................................................... [no-gen-acls, no-auth]
  |     o- acls .......................................................................... [ACLs: 2]
  |     | o- iqn.1994-05.com.redhat:mmm124 ........................................ [Mapped LUNs: 2]
  |     | | o- mapped_lun0 ................................................ [lun0 block/block0 (rw)]
  |     | | o- mapped_lun1 ................................................ [lun1 block/block1 (rw)]
  |     | o- iqn.1994-05.com.redhat:mmm125 ........................................ [Mapped LUNs: 2]
  |     |   o- mapped_lun0 ................................................ [lun0 block/block0 (rw)]
  |     |   o- mapped_lun1 ................................................ [lun1 block/block1 (rw)]
  |     o- luns .......................................................................... [LUNs: 2]
  |     | o- lun0 .................................... [block/block0 (/dev/sdb1) (default_tg_pt_gp)]
  |     | o- lun1 .................................... [block/block1 (/dev/sdc1) (default_tg_pt_gp)]
  |     o- portals .................................................................... [Portals: 1]
  |       o- 192.168.137.126:3260 ............................................................. [OK]
  o- loopback ......................................................................... [Targets: 0]


systemctl enable target
systemctl start target

 

 

-- 4. プライマリサイト 共有ディスク設定[mmm121,mmm122]

yum install -y iscsi-initiator-utils

vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1994-05.com.redhat:mmm121   ←mmm121の場合
InitiatorName=iqn.1994-05.com.redhat:mmm122   ←mmm122の場合


systemctl enable iscsi
systemctl enable iscsid

systemctl start iscsi
systemctl start iscsid

iscsiadm --mode discoverydb --type sendtargets --portal 192.168.137.123 --discover
iscsiadm --mode node --targetname iqn.1994-05.com.redhat:mmm123 --portal 192.168.137.123 --login
iscsiadm --mode session -P3


/usr/lib/udev/scsi_id -g -u -d /dev/sdb
/usr/lib/udev/scsi_id -g -u -d /dev/sdc


vim /etc/udev/rules.d/99-vmware-scsi-timeout.rules

ACTION=="add", SUBSYSTEMS=="scsi", ATTRS{vendor}=="VMware ", ATTRS{model}=="Virtual disk ", RUN+="/bin/sh -c 'echo 180 > /sys$DEVPATH/timeout'"
KERNEL=="sdb", ENV{ID_SERIAL}=="36001405124dcb8d2abf4582be8206fe7", SYMLINK+="oracleasm/asmdata11", OWNER="grid", GROUP="asmadmin", MODE="0660"
KERNEL=="sdc", ENV{ID_SERIAL}=="360014058f8772f07cf24585a8af99b57", SYMLINK+="oracleasm/asmdata12", OWNER="grid", GROUP="asmadmin", MODE="0660"

↑2,3行のラベルはscsi_idコマンドの結果で置き換える


cat /etc/udev/rules.d/99-vmware-scsi-timeout.rules

reboot

ll /dev/sd*

 


-- 5. スタンバイサイト 共有ディスク設定[mmm124,mmm125]

yum install -y iscsi-initiator-utils

vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1994-05.com.redhat:mmm124   ←mmm124の場合
InitiatorName=iqn.1994-05.com.redhat:mmm125   ←mmm125の場合


systemctl enable iscsi
systemctl enable iscsid

systemctl start iscsi
systemctl start iscsid

iscsiadm --mode discoverydb --type sendtargets --portal 192.168.137.126 --discover
iscsiadm --mode node --targetname iqn.1994-05.com.redhat:mmm126 --portal 192.168.137.126 --login
iscsiadm --mode session -P3

 


/usr/lib/udev/scsi_id -g -u -d /dev/sdb
/usr/lib/udev/scsi_id -g -u -d /dev/sdc


vim /etc/udev/rules.d/99-vmware-scsi-timeout.rules

ACTION=="add", SUBSYSTEMS=="scsi", ATTRS{vendor}=="VMware ", ATTRS{model}=="Virtual disk ", RUN+="/bin/sh -c 'echo 180 > /sys$DEVPATH/timeout'"
KERNEL=="sdb", ENV{ID_SERIAL}=="36001405ab2cf542cf1640329731b9e52", SYMLINK+="oracleasm/asmdata21", OWNER="grid", GROUP="asmadmin", MODE="0660"
KERNEL=="sdc", ENV{ID_SERIAL}=="360014053b9b5cb35b454faf8c9ed5c8d", SYMLINK+="oracleasm/asmdata22", OWNER="grid", GROUP="asmadmin", MODE="0660"

↑2,3行のラベルはscsi_idコマンドの結果で置き換える


cat /etc/udev/rules.d/99-vmware-scsi-timeout.rules


reboot

ll /dev/sd*

 


-- 6. プライマリサイト GIインストール[mmm121]


--gridユーザで実行

mkdir -p /u01/app/19.0.0/grid
chown grid:oinstall /u01/app/19.0.0/grid
cd /u01/app/19.0.0/grid
unzip /tmp/LINUX.X64_193000_grid_home.zip


su root

rpm -Uvh /u01/app/19.0.0/grid/cv/rpm/cvuqdisk-1.0.10-1.rpm
※2号機にも転送してインストール

--------------------------------------------
-- インストール時のチェック対応
※1号機と2号機で実施

vim /etc/security/limits.conf

grid soft nproc 2047
grid hard nproc 16384
grid soft nofile 1024
grid hard nofile 65536 
grid  soft  stack   10240
grid  hard  stack   32768


yum install compat-libstdc++-33 

※パッケージgcc-c++yumでエラーとなるので、無視
--------------------------------------------


exit

 

LANG=C /u01/app/19.0.0/grid/gridSetup.sh

/dev/sdbをDATAディスクグループに追加

 

asmca

/dev/sdcをFRAディスクグループに追加


vim /root/.bash_profile
※1号機と2号機で実施

export ORACLE_BASE=/u01/app/grid
export ORACLE_HOME=/u01/app/19.0.0/grid
export NLS_LANG=Japanese_Japan.AL32UTF8
export PATH=$PATH:$ORACLE_HOME/bin
umask 022

. /root/.bash_profile

crsctl stat res -t


-- 7. スタンバイサイト GIインストール[mmm124]


--gridユーザで実行

mkdir -p /u01/app/19.0.0/grid
chown grid:oinstall /u01/app/19.0.0/grid
cd /u01/app/19.0.0/grid
unzip /tmp/LINUX.X64_193000_grid_home.zip


su root

rpm -Uvh /u01/app/19.0.0/grid/cv/rpm/cvuqdisk-1.0.10-1.rpm
※2号機にも転送してインストール

--------------------------------------------
-- インストール時のチェック対応
※1号機と2号機で実施

vim /etc/security/limits.conf

grid soft nproc 2047
grid hard nproc 16384
grid soft nofile 1024
grid hard nofile 65536 
grid  soft  stack   10240
grid  hard  stack   32768


yum install compat-libstdc++-33 
※パッケージgcc-c++yumでエラーとなるので、無視

--------------------------------------------

exit


LANG=C /u01/app/19.0.0/grid/gridSetup.sh

/dev/sdbをDATAディスクグループに追加

 

asmca

/dev/sdcをFRAディスクグループに追加

 

vim /root/.bash_profile
※1号機と2号機で実施

export ORACLE_BASE=/u01/app/grid
export ORACLE_HOME=/u01/app/19.0.0/grid
export NLS_LANG=Japanese_Japan.AL32UTF8
export PATH=$PATH:$ORACLE_HOME/bin
umask 022

. /root/.bash_profile

crsctl stat res -t

 

-- 8. プライマリサイト Oracleソフトウェアインストール[mmm121]

--oracleユーザで実行
mkdir -p /u01/app/oracle/product/19.0.0/dbhome_1
chown oracle:oinstall /u01/app/oracle/product/19.0.0/dbhome_1
cd /u01/app/oracle/product/19.0.0/dbhome_1
unzip /tmp/LINUX.X64_193000_db_home.zip

LANG=C ./runInstaller

-- 9. スタンバイサイト Oracleソフトウェアインストール[mmm124]

--oracleユーザで実行
mkdir -p /u01/app/oracle/product/19.0.0/dbhome_1
chown oracle:oinstall /u01/app/oracle/product/19.0.0/dbhome_1
cd /u01/app/oracle/product/19.0.0/dbhome_1
unzip /tmp/LINUX.X64_193000_db_home.zip

LANG=C ./runInstaller

-- 10. プライマリサイト DB構築[mmm121]

export NLS_LANG=American_America.AL32UTF8
LANG=C dbca


※DB構築はプライマリサイトのみ。


-- 11. GI自動起動の無効化[mmm121,mmm122,mmm124,mmm125]

crsctl disable crs

-- 12. PDB自動起動設定[mmm121,mmm122]

export ORACLE_SID=moon1
export ORACLE_SID=moon2
sqlplus / as sysdba

show pdbs;
alter pluggable database pdb1 save state;
show pdbs;

-- 13. glogin.sql設定[mmm121,mmm122,mmm124,mmm125]

vim $ORACLE_HOME/sqlplus/admin/glogin.sql

set lines 1000
set pages 5000
set trims on
set sqlprompt "&_connect_identifier(&_user)> "


vim ~/.bashrc
alias cdh='cd $ORACLE_HOME'
alias cdb='cd $ORACLE_BASE'
alias sql='sqlplus / as sysdba'

. ~/.bashrc

-- 14. テストテーブル作成[mmm121]

export ORACLE_SID=moon1
sqlplus / as sysdba

alter session set container=pdb1;
create user test identified by test;
grant dba to test;

conn test/test@mmm121-vip.example.com:1521/pdb1
create table tab1(col1 int);
insert into tab1 values(1);
commit;
select * from tab1;

 

-- 15. ネットワーク設定[mmm121,mmm122,mmm124,mmm125]

cd $ORACLE_HOME/network/admin
vim tnsnames.ora

MOON =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = mmm121-vip)(PORT = 1521) )
    (ADDRESS = (PROTOCOL = TCP)(HOST = mmm122-vip)(PORT = 1521) )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = moon)
    )
  )

MOON1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = mmm121-vip.example.com)(PORT = 1521) )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = moon)
    )
  )
  
MOON2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = mmm122-vip.example.com)(PORT = 1521) )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = moon)
    )
  )

pdb1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = mmscan133.example.com)(PORT = 1521) )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = pdb1)
    )
  )

pdb11 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = mmm121-vip.example.com)(PORT = 1521) )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = pdb1)
    )
  )

pdb12 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = mmm122-vip.example.com)(PORT = 1521) )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = pdb1)
    )
  )

SUN=
  (DESCRIPTION =
    (ADDRESS_LIST=
    (ADDRESS = (PROTOCOL = TCP)(HOST = mmm124-vip)(PORT = 1521) )
    (ADDRESS = (PROTOCOL = TCP)(HOST = mmm125-vip)(PORT = 1521) ) )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = sun)
    )
  )

SUN1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = mmm124-vip.example.com)(PORT = 1521) )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = sun)
    )
  )

SUN2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = mmm125-vip.example.com)(PORT = 1521) )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = sun)
    )
  )

PDB1RO =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = mmscan136.example.com)(PORT = 1521) )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = pdb1)
    )
  )

PDB11RO =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = mmm124-vip.example.com)(PORT = 1521) )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = pdb1)
    )
  )

PDB12RO =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = mmm125-vip.example.com)(PORT = 1521) )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = pdb1)
    )
  )
  


cat tnsnames.ora

echo "select instance_name from v\$instance;" |  sqlplus sys/oracle@MOON  as sysdba
echo "select instance_name from v\$instance;" |  sqlplus sys/oracle@MOON1 as sysdba
echo "select instance_name from v\$instance;" |  sqlplus sys/oracle@MOON2 as sysdba

echo "select instance_name from v\$instance;" |  sqlplus test/test@PDB1
echo "select instance_name from v\$instance;" |  sqlplus test/test@PDB11
echo "select instance_name from v\$instance;" |  sqlplus test/test@PDB12

 


--------[2]RACデータガード構築--------


-- 1. データガード前提条件の確認と設定[mmm121]

export ORACLE_SID=moon1
sqlplus / as sysdba

show pdbs
archive log list
select FORCE_LOGGING from V$DATABASE ;
select flashback_on from v$database ;
select GROUP#, THREAD#, BYTES/1024/1024, MEMBERS from V$LOG order by 1, 2 ;

select GROUP#, THREAD#, BYTES/1024/1024 from V$STANDBY_LOG order by 1, 2;

col FILE_NAME for a60
select FILE_NAME, FORMAT, IS_ASM from V$PASSWORDFILE_INFO ;

 

alter database force logging ;
select FORCE_LOGGING from V$DATABASE ;

alter database flashback on;
select flashback_on from v$database ;

-- スタンバイREDOは(REDOグループ数+1)個作成、メンバー数は1固定

alter database add standby logfile thread 1 size 200M;
alter database add standby logfile thread 1 size 200M;
alter database add standby logfile thread 1 size 200M;
alter database add standby logfile thread 2 size 200M;
alter database add standby logfile thread 2 size 200M;
alter database add standby logfile thread 2 size 200M;

select GROUP#, THREAD#, BYTES/1024/1024 from V$STANDBY_LOG order by 1, 2;

 


-- 2. プライマリDBの初期化パラメータ修正[mmm121]

export ORACLE_SID=moon1
sqlplus / as sysdba

set lines 300 pages 50000 tab off trim on
col NAME for a30
col VALUE for a150
select INST_ID, NAME, VALUE from GV$PARAMETER
 where upper(NAME) in (
         'LOG_ARCHIVE_CONFIG',
         'LOG_ARCHIVE_DEST_1',
         'LOG_ARCHIVE_DEST_2',
         'LOG_ARCHIVE_DEST_3',
         'LOG_ARCHIVE_DEST_STATE_1',
         'LOG_ARCHIVE_DEST_STATE_2',
         'LOG_ARCHIVE_DEST_STATE_3',
         'LOG_ARCHIVE_FORMAT',
         'REMOTE_LOGIN_PASSWORDFILE',
         'DB_RECOVERY_FILE_DEST',
         'DB_RECOVERY_FILE_DEST_SIZE',
         'FAL_CLIENT',
         'FAL_SERVER',
         'STANDBY_FILE_MANAGEMENT',
         'DB_NAME',
         'DB_UNIQUE_NAME',
         'AUDIT_FILE_DEST',
         'DIAGNOSTIC_DEST',
         'REMOTE_LISTENER',
         'CLUSTER_INTERCONNECTS')
 order by 2, 1 ;


-- パラメータ変更

alter system set LOG_ARCHIVE_CONFIG='DG_CONFIG=(moon,sun)' scope=both sid='*' ;

alter system set LOG_ARCHIVE_DEST_1='location=USE_DB_RECOVERY_FILE_DEST valid_for=(ALL_LOGFILES,ALL_ROLES) MAX_FAILURE=1 REOPEN=5 DB_UNIQUE_NAME=moon ALTERNATE=LOG_ARCHIVE_DEST_2' scope=both sid='*' ;
alter system set LOG_ARCHIVE_DEST_2='location=+DATA valid_for=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=moon ALTERNATE=LOG_ARCHIVE_DEST_1' scope=both sid='*' ;


alter system set LOG_ARCHIVE_DEST_3='SERVICE=SUN ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=sun' scope=both sid='*' ;

alter system set log_archive_dest_state_2='ALTERNATE' scope=both sid='*' ;


alter system set FAL_CLIENT='MOON' scope=both sid='*' ;
alter system set FAL_SERVER='SUN' scope=both sid='*' ;
alter system set STANDBY_FILE_MANAGEMENT='AUTO' scope=both sid='*' ;

-- 3. バックアップを格納するディレクトリを作成[mmm121,mmm124]

export ORACLE_SID=+ASM1

asmcmd
cd +DATA
mkdir BKUP


-- 4. バックアップ取得[mmm121]
-- oracleユーザで実行

export ORACLE_SID=moon1
export NLS_DATE_FORMAT="YYYY/MM/DD HH24:MI:SS"
rman target /

※DBIDは後で使用するため、記録しておく
ターゲット・データベース: MOON (DBID=2849016951)に接続されました


CONFIGURE DEVICE TYPE DISK PARALLELISM 2 ;

delete noprompt force archivelog all;

delete noprompt force backup of archivelog all ;
delete noprompt force backup of database ;
delete noprompt force backup of controlfile ;
delete noprompt force datafilecopy all ;


BACKUP
  DEVICE TYPE DISK FORMAT '+DATA/BKUP/%U'
  ARCHIVELOG ALL ;

BACKUP  
  DEVICE TYPE DISK FORMAT '+DATA/BKUP/%U'
  INCREMENTAL LEVEL 1 FOR RECOVER OF COPY WITH TAG 'incr_update'
  DATABASE ;

BACKUP
  DEVICE TYPE DISK FORMAT '+DATA/BKUP/%U' TAG 'controlfile'
  CURRENT CONTROLFILE ;

BACKUP
  DEVICE TYPE DISK FORMAT '+DATA/BKUP/%U' TAG 'spfile'
  SPFILE ;


BACKUP
  DEVICE TYPE DISK FORMAT '+DATA/BKUP/%U'
  ARCHIVELOG ALL ;


list backup summary;
list datafilecopy all ;


list backup of archivelog all ;
list backupset 18;
list backupset 20;

-- 5. バックアップファイルをStandby Database側へコピー[mmm121]

 

export ORACLE_SID=+ASM1
asmcmd

 

cp +FRA/MOON/DATAFILE/system.274.1094855165    sys/oracle@mmm124.+ASM1:+DATA/BKUP/system.bk
cp +FRA/MOON/DATAFILE/sysaux.271.1094855165   sys/oracle@mmm124.+ASM1:+DATA/BKUP/sysaux.bk
cp +FRA/MOON/DATAFILE/undotbs1.275.1094855179   sys/oracle@mmm124.+ASM1:+DATA/BKUP/undotbs1.bk
cp +FRA/MOON/DATAFILE/undotbs2.264.1094855199   sys/oracle@mmm124.+ASM1:+DATA/BKUP/undotbs2.bk
cp +FRA/MOON/DATAFILE/users.279.1094855203   sys/oracle@mmm124.+ASM1:+DATA/BKUP/users.bk

cp +FRA/MOON/D63FE6060AB54833E0537989A8C073EE/DATAFILE/system.265.1094855195  sys/oracle@mmm124.+ASM1:+DATA/BKUP/system.s.bk
cp +FRA/MOON/D63FE6060AB54833E0537989A8C073EE/DATAFILE/sysaux.270.1094855199 sys/oracle@mmm124.+ASM1:+DATA/BKUP/sysaux.s.bk
cp +FRA/MOON/D63FE6060AB54833E0537989A8C073EE/DATAFILE/undotbs1.272.1094855181 sys/oracle@mmm124.+ASM1:+DATA/BKUP/undotbs1.s.bk


cp +FRA/MOON/D6409C05853B62E5E0537A89A8C00976/DATAFILE/system.273.1094855197   sys/oracle@mmm124.+ASM1:+DATA/BKUP/system.p.bk
cp +FRA/MOON/D6409C05853B62E5E0537A89A8C00976/DATAFILE/sysaux.282.1094855203  sys/oracle@mmm124.+ASM1:+DATA/BKUP/sysaux.p.bk
cp +FRA/MOON/D6409C05853B62E5E0537A89A8C00976/DATAFILE/undotbs1.266.1094855187  sys/oracle@mmm124.+ASM1:+DATA/BKUP/undotbs1.p.bk
cp +FRA/MOON/D6409C05853B62E5E0537A89A8C00976/DATAFILE/undo_2.267.1094855189  sys/oracle@mmm124.+ASM1:+DATA/BKUP/undo_2.p.bk
cp +FRA/MOON/D6409C05853B62E5E0537A89A8C00976/DATAFILE/users.278.1094855205  sys/oracle@mmm124.+ASM1:+DATA/BKUP/users.p.bk

 


-- 制御ファイル、SPFILE、アーカイブログのバックアップも同様にリモート・コピー

cp  +DATA/BKUP/0s0k4afn_1_1  sys/oracle@mmm124.+ASM1:+DATA/BKUP/0s0k4afn_1_1.bk
cp  +DATA/BKUP/0r0k4afn_1_1  sys/oracle@mmm124.+ASM1:+DATA/BKUP/0r0k4afn_1_1.bk
cp  +DATA/BKUP/1g0k4ahj_1_1  sys/oracle@mmm124.+ASM1:+DATA/BKUP/1g0k4ahj_1_1.bk
cp  +DATA/BKUP/1h0k4ahj_1_1  sys/oracle@mmm124.+ASM1:+DATA/BKUP/1h0k4ahj_1_1.bk

cp +DATA/BKUP/1c0k4ah9_1_1   sys/oracle@mmm124.+ASM1:+DATA/BKUP/1c0k4ah9_1_1.bk
cp +DATA/BKUP/1e0k4ahe_1_1   sys/oracle@mmm124.+ASM1:+DATA/BKUP/1e0k4ahe_1_1.bk

 

-- 6. パスワードファイルをスタンバイ側へコピー[mmm121]

-- gridユーザ

export ORACLE_SID=+ASM1
asmcmd


cp +DATA/MOON/PASSWORD/pwdmoon.258.1094764905     /tmp/orapwsun
exit

-- oracleユーザ

cd /tmp
scp orapwsun mmm124:/u01/app/oracle/product/19.0.0/dbhome_1/dbs/orapwsun1
scp orapwsun mmm125:/u01/app/oracle/product/19.0.0/dbhome_1/dbs/orapwsun2


-- 7. 監査ファイルの保存先の作成[mmm124,mmm125]

-- スタンバイDB1号機で実施
mkdir -p /u01/app/oracle/admin/sun/adump
mkdir -p /u01/app/oracle/diag/rdbms/sun/sun1

-- スタンバイDB2号機で実施
mkdir -p /u01/app/oracle/admin/sun/adump
mkdir -p /u01/app/oracle/diag/rdbms/sun/sun2

 

 

-- 8. 補助インスタンス用の初期化パラメータ・ファイルの作成[mmm124]

vim /tmp/pfileAUX.ora

*.DB_NAME='moon'
*.DB_UNIQUE_NAME='sun'
*.DB_BLOCK_SIZE=8192
*.MEMORY_TARGET=2g
*.REMOTE_LOGIN_PASSWORDFILE='EXCLUSIVE'


-- 9. 補助インスタンス起動[mmm124]

export ORACLE_SID=sun1
env | grep ORA

sqlplus / as sysdba

startup nomount pfile='/tmp/pfileAUX.ora' ;

-- Password Fileを読み込んでいることを確認
set lines 160 pages 50000 tab off trim on
col FILE_NAME for a60
select FILE_NAME, FORMAT, IS_ASM from V$PASSWORDFILE_INFO ;

 

-- 10. RMANバックアップからスタンバイDBの作成[mmm124]

export ORACLE_SID=sun1
rman auxiliary /

duplicate database 'moon' DBID 2849016951 for standby 
  backup location '+DATA/BKUP/'
  dorecover
  spfile
    set DB_UNIQUE_NAME='sun'
    set LOG_ARCHIVE_DEST_1='location=USE_DB_RECOVERY_FILE_DEST valid_for=(ALL_LOGFILES,ALL_ROLES) MAX_FAILURE=1 REOPEN=5 DB_UNIQUE_NAME=sun ALTERNATE=LOG_ARCHIVE_DEST_2'
    set LOG_ARCHIVE_DEST_2='location=+DATA valid_for=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=sun ALTERNATE=LOG_ARCHIVE_DEST_1'
    set LOG_ARCHIVE_DEST_3='SERVICE=MOON ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=moon'
    set FAL_SERVER='MOON'
    set FAL_CLIENT='SUN'
    set AUDIT_FILE_DEST='/u01/app/oracle/admin/sun/adump'
    set INSTANCE_NUMBER='1'
    set CONTROL_FILES='+DATA/SUN/CONTROLFILE/standby_controlfile.ctl'
    set remote_listener='mmscan136.example.com:1521'
;

 

-- 複製されたデータベースの名前、インスタンス名、ロールを確認

export ORACLE_SID=sun1
sqlplus / as sysdba

select NAME, DB_UNIQUE_NAME, OPEN_MODE, DATABASE_ROLE, FLASHBACK_ON from V$DATABASE ;

alter database flashback on ;
select NAME, DB_UNIQUE_NAME, OPEN_MODE, DATABASE_ROLE, FLASHBACK_ON from V$DATABASE ;


-- 11. SPFILE作成[mmm124]

create pfile='/tmp/pfileSTB.ora' from spfile ;
shutdown immediate ;

cp /tmp/pfileSTB.ora /tmp/pfileSTB.ora.bk
vim /tmp/pfileSTB.ora

アンダースコアで始まるパラメータを削除

次のパラメータが存在している場合は削除
*.instance_number
*.thread
*.undo_tablespace

インスタンス名を修正
moon1 -> sun1
moon2 -> sun2

*.dispatchers='(PROTOCOL=TCP) (SERVICE=moonXDB)'

*.dispatchers='(PROTOCOL=TCP) (SERVICE=sunXDB)'

 

 


-- 12. SPFILEのASM配置[mmm124]

SPFILE格納用ディレクトリを作成
export ORACLE_SID=+ASM1
asmcmd

mkdir +DATA/SUN/parameterfile


export ORACLE_SID=sun1
sqlplus / as sysdba
create spfile='+DATA/SUN/parameterfile/spfilesun.ora' from pfile='/tmp/pfileSTB.ora' ;


-- 13. PFILE作成[mmm124,mmm125]


-- スタンバイDB1号機で実施
rm -rf $ORACLE_HOME/dbs/spfilesun1.ora
echo "SPFILE='+DATA/SUN/parameterfile/spfilesun.ora'" > $ORACLE_HOME/dbs/initsun1.ora

-- スタンバイDB2号機で実施
rm -rf $ORACLE_HOME/dbs/spfilesun2.ora
echo "SPFILE='+DATA/SUN/parameterfile/spfilesun.ora'" > $ORACLE_HOME/dbs/initsun2.ora

-- 14. 第 2 制御ファイルの作成[mmm124]

export ORACLE_SID=+ASM1
asmcmd

mkdir +FRA/SUN/controlfile


export ORACLE_SID=sun1
sqlplus / as sysdba

startup nomount;

alter system set control_files='+DATA/SUN/controlfile/current','+FRA/SUN/controlfile/current' scope=spfile sid='*' ;

shutdown immediate;
startup nomount; 


export ORACLE_SID=sun1
rman target /
restore controlfile from '+DATA/SUN/controlfile/standby_controlfile.ctl';

shutdown immediate;

 

-- 15. パスワードファイルのASM配置[mmm124]

export ORACLE_SID=+ASM1
asmcmd

mkdir +DATA/SUN/password

cp /u01/app/oracle/product/19.0.0/dbhome_1/dbs/orapwsun1 +DATA/SUN/password/orapwsun

 

 

-- 16. GIへのリソース登録[mmm124]


srvctl add database -db sun -oraclehome /u01/app/oracle/product/19.0.0/dbhome_1 -dbtype RAC -dbname sun -role physical_standby -spfile "+DATA/SUN/parameterfile/spfilesun.ora" -pwfile "+DATA/SUN/password/orapwsun"
srvctl add instance -db sun -instance sun1 -node mmm124
srvctl add instance -db sun -instance sun2 -node mmm125
srvctl config database -db sun -all


-- 17. スタンバイDBの起動[mmm124]

srvctl start database -db sun -startoption mount


-------------------------------------
※エラー発生
PRCD-1332 : データベースsunの起動に失敗しました
PRCR-1079 : リソースora.sun.dbの起動に失敗しました
CRS-5017: リソース・アクション"ora.sun.db start"に次のエラーが発生しました:
ORA-01565: error in identifying file '+DATA/SUN/parameterfile/spfilesun.ora'
ORA-17503: ksfdopn:2 Failed to open file +DATA/SUN/parameterfile/spfilesun.ora
ORA-15001: diskgroup "DATA" does not exist or is not mounted
ORA-15040: diskgroup is incomplete
。詳細は"(:CLSN00107:)"("/u01/app/grid/diag/crs/mmm125/crs/trace/crsd_oraagent_oracle.trc")を参照してください。
CRS-2674: 'ora.sun.db'('mmm125')の起動に失敗しました
CRS-2632: 配置ポリシーを満たす場所へのリソース'ora.sun.db'の配置を試行するサーバーはありません

-------------------------------------

srvctl stop database -db sun
srvctl start database -db sun -startoption mount

DBを再起動するとエラーは発生しなくなった

 

export ORACLE_SID=sun1
sqlplus / as sysdba

alter database recover managed standby database disconnect from session ;

set linesize 170 pages 50000 tab off trim on
col VALUE for a32
select PROCESS,PID,STATUS,THREAD#,SEQUENCE# from V$MANAGED_STANDBY where PROCESS='MRP0';

select SOURCE_DB_UNIQUE_NAME, NAME, VALUE, UNIT from V$DATAGUARD_STATS ;


-- 18. Data Guard構成確認[mmm121]

set linesize 250 pages 5000 tab off
col FORCE_LOGGING for a6
col FLASHBACK_ON for a6
select DBID, NAME, DB_UNIQUE_NAME, DATABASE_ROLE, PROTECTION_MODE, CURRENT_SCN, FLASHBACK_ON, FORCE_LOGGING from V$DATABASE ;


select * from V$DATAGUARD_CONFIG ;

 

set linesize 200 pages 5000 tab off
col DEST_NAME for a20
col DB_UNIQUE_NAME for a8
col TARGET for a8
col RECOVERY_MODE for a25
col GAP_STATUS for a10
select A.DEST_ID, A.DEST_NAME, A.DB_UNIQUE_NAME, B.DATABASE_MODE, B.RECOVERY_MODE, 
       A.TRANSMIT_MODE, A.AFFIRM, A.TARGET, A.STATUS, A.LOG_SEQUENCE, A.APPLIED_SCN, 
       B.GAP_STATUS, A.ERROR, B.ERROR
  from V$ARCHIVE_DEST A, V$ARCHIVE_DEST_STATUS B
 where A.DEST_ID=B.DEST_ID
   and A.TARGET in ('STANDBY', 'REMOTE') ;

 

set linesize 200 pages 5000 tab off
col PID for a10
select NAME, PID, TYPE, ROLE, ACTION, CLIENT_PID, CLIENT_ROLE, THREAD#, SEQUENCE#, BLOCK#, BLOCK_COUNT, DELAY_MINS, DEST_ID, DBID, DGID, INSTANCE
  from V$DATAGUARD_PROCESS 
 order by 1 ;


-- 19. Data Guard構成確認[mmm124,mmm125]


set linesize 200 pages 5000 tab off
col PID for a10
select NAME, PID, TYPE, ROLE, ACTION, CLIENT_PID, CLIENT_ROLE, THREAD#, SEQUENCE#, BLOCK#, BLOCK_COUNT, DELAY_MINS, DEST_ID, DBID, DGID, INSTANCE
  from V$DATAGUARD_PROCESS 
 order by 1 ;


-- 読み取りオープン
※スタンバイDB1号機とスタンバイDB2号機のそれぞれで実行する

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
ALTER DATABASE OPEN;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;
alter pluggable database pdb1 open;
alter pluggable database pdb1 save state; --> スタンバイ側ではエラーとなる

 

echo "select instance_name from v\$instance;" |  sqlplus sys/oracle@SUN  as sysdba
echo "select instance_name from v\$instance;" |  sqlplus sys/oracle@SUN1 as sysdba
echo "select instance_name from v\$instance;" |  sqlplus sys/oracle@SUN2 as sysdba

echo "select instance_name from v\$instance;" |  sqlplus test/test@PDB1RO
echo "select instance_name from v\$instance;" |  sqlplus test/test@PDB11RO
echo "select instance_name from v\$instance;" |  sqlplus test/test@PDB12RO

 

 

 

(14)
【1】ストリーミングレプリケーション+Pgpool-Ⅱ(負荷分散)

https://www.fujitsu.com/jp/products/software/resources/feature-stories/postgres/article-index/pgpool2/
https://qiita.com/isobecky74/items/1420155715a85eb8748f

https://www.conversion.co.jp/technology/blog/-/detail/=/blog_id=7802823
https://www.pgpool.net/docs/latest/ja/html/index.html
https://qiita.com/mkyz08/items/91a883a9876125123da5

 

OS: CentOS7
メモリ2G/ディスク60G

pgpool-II version 4.3.0 (tamahomeboshi)

プライマリサイト
mmm121 Pgpool-Ⅱ(負荷分散機能のみ使用)
mmm122 node1
mmm123 node2

DRサイト
mmm125 Pgpool-Ⅱ(負荷分散機能のみ使用)
mmm126 node1
mmm127 node2


※下記のようにカスケードレプリケーションを設定する

mmm122

mmm123


mmm126

mmm127

※pgpoolでmd5認証を使用したい場合、postgreSQLの初期化パラメータで設定が必要
password_encryption = md5


-- 1. postgreSQLインストール[mmm122,mmm123,mmm126,mmm127]

-- リポジトリの追加

yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum info postgresql14-server


-- インストール
yum install -y epel-release centos-release-scl

yum -y install postgresql14-server postgresql14-contrib postgresql14-devel postgresql14-libs
/usr/pgsql-14/bin/postgres --version

-- DB初期化
export PGSETUP_INITDB_OPTIONS='-E UTF8 --locale=C'
/usr/pgsql-14/bin/postgresql-14-setup initdb


-- DB起動
systemctl start postgresql-14
systemctl status postgresql-14


-- DB接続
su - postgres
psql

-- postgresDBユーザのパスワード設定
SET password_encryption = 'md5';
alter user postgres with encrypted password 'postgres';

-- pgpool用DBユーザの作成
SET password_encryption = 'md5';
CREATE user pgpool with superuser encrypted password 'pgpool';


-- visudoでpostgresユーザ追加

visudo

postgres ALL=(ALL)  NOPASSWD: ALL


-- 2. mmm122 -> mmm123 のレプリケーション設定

 

-- レプリケーション用のユーザーを作成する[mmm122]

CREATE USER repl_user REPLICATION PASSWORD 'repl_user';


-- マスターとスレーブが接続できるように設定する[mmm122]

vim /var/lib/pgsql/14/data/pg_hba.conf

↓記述追加
host replication repl_user 127.0.0.1/32 md5
host replication repl_user 192.168.137.0/24 md5
host all all 192.168.137.0/24 md5

local   all             all                                     peer

local   all             all                                     trust


-- postgres.confの設定[mmm122]

mkdir -p /var/lib/pgsql/14/archive

cp /var/lib/pgsql/14/data/postgresql.conf /var/lib/pgsql/14/data/postgresql.conf.bk`date +"%Y%m%d%H%M%S"`
vim /var/lib/pgsql/14/data/postgresql.conf

wal_level = replica
synchronous_commit = on
max_wal_senders = 10
archive_mode = on
archive_command = 'test ! -f /var/lib/pgsql/14/archive/%f && cp %p /var/lib/pgsql/14/archive/%f'
hot_standby = on
log_filename = 'postgresql-%Y-%m-%d.log'
listen_addresses = '*'
hot_standby_feedback = on
max_replication_slots = 10
primary_conninfo = 'user=repl_user password=repl_user host=192.168.137.123 port=5432 application_name=mmm122'
primary_slot_name = 'slot_123'
password_encryption = md5


sudo systemctl restart postgresql-14

-- スロットの作成[mmm122]
SELECT * FROM pg_create_physical_replication_slot('slot_122');

-- ベースバックアップをスレーブに転送する[mmm123]
su - postgres

sudo systemctl stop postgresql-14


mkdir -p /var/lib/pgsql/14/archive
mv /var/lib/pgsql/14/data /var/lib/pgsql/14/data.bak
pg_basebackup -h 192.168.137.122 -U repl_user -D /var/lib/pgsql/14/data/ -P --wal-method=fetch -R

-- スレーブDBの設定[mmm123]

cd /var/lib/pgsql/14/data

vim /var/lib/pgsql/14/data/postgresql.conf

primary_conninfo = 'user=repl_user password=repl_user host=192.168.137.123 port=5432 application_name=mmm122'
primary_slot_name = 'slot_123'

primary_conninfo = 'user=repl_user password=repl_user host=192.168.137.122 port=5432 application_name=mmm123'
primary_slot_name = 'slot_122'

 

-- スレーブDBの起動[mmm123]

sudo systemctl start postgresql-14

-- スロットの作成[mmm123]
SELECT * FROM pg_create_physical_replication_slot('slot_123');


-- レプリケーションの状態を確認[mmm122]
select * from pg_stat_replication;

-- スロット使用確認[mmm122]
SELECT slot_name, active FROM pg_replication_slots;

-- コンフリクトの確認[mmm123]
select * from pg_stat_database_conflicts;


-- 3. mmm123 -> mmm126 のレプリケーション設定


-- ベースバックアップをスレーブに転送する[mmm126]
su - postgres

sudo systemctl stop postgresql-14


mkdir -p /var/lib/pgsql/14/archive
mv /var/lib/pgsql/14/data /var/lib/pgsql/14/data.bak
pg_basebackup -h 192.168.137.123 -U repl_user -D /var/lib/pgsql/14/data/ -P --wal-method=fetch -R

-- スレーブDBの設定[mmm126]

cd /var/lib/pgsql/14/data

vim /var/lib/pgsql/14/data/postgresql.conf

primary_conninfo = 'user=repl_user password=repl_user host=192.168.137.122 port=5432 application_name=mmm123'
primary_slot_name = 'slot_122'

primary_conninfo = 'user=repl_user password=repl_user host=192.168.137.123 port=5432 application_name=mmm126'
primary_slot_name = 'slot_123'

 

-- スレーブDBの起動[mmm126]

sudo systemctl start postgresql-14

-- スロットの作成[mmm126]
SELECT * FROM pg_create_physical_replication_slot('slot_126');


-- レプリケーションの状態を確認[mmm123]
select * from pg_stat_replication;

-- スロット使用確認[mmm123]
SELECT slot_name, active FROM pg_replication_slots;

-- コンフリクトの確認[mmm126]
select * from pg_stat_database_conflicts;


-- 4. mmm126 -> mmm127 のレプリケーション設定


-- ベースバックアップをスレーブに転送する[mmm127]
su - postgres

sudo systemctl stop postgresql-14


mkdir -p /var/lib/pgsql/14/archive
mv /var/lib/pgsql/14/data /var/lib/pgsql/14/data.bak
pg_basebackup -h 192.168.137.126 -U repl_user -D /var/lib/pgsql/14/data/ -P --wal-method=fetch -R

-- スレーブDBの設定[mmm127]

cd /var/lib/pgsql/14/data

vim /var/lib/pgsql/14/data/postgresql.conf

primary_conninfo = 'user=repl_user password=repl_user host=192.168.137.123 port=5432 application_name=mmm126'
primary_slot_name = 'slot_123'

primary_conninfo = 'user=repl_user password=repl_user host=192.168.137.126 port=5432 application_name=mmm127'
primary_slot_name = 'slot_126'

 

-- スレーブDBの起動[mmm127]

sudo systemctl start postgresql-14

-- スロットの作成[mmm127]
SELECT * FROM pg_create_physical_replication_slot('slot_127');


-- レプリケーションの状態を確認[mmm126]
select * from pg_stat_replication;

-- スロット使用確認[mmm126]
SELECT slot_name, active FROM pg_replication_slots;

-- コンフリクトの確認[mmm127]
select * from pg_stat_database_conflicts;

-- 5. プライマリサイトのPgpool-Ⅱの設定


-- psqlクライアントのインストール[mmm121]

yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum -y install postgresql14

-- Pgpool-Ⅱのインストール[mmm121]

yum install -y https://www.pgpool.net/yum/rpms/4.3/redhat/rhel-7-x86_64/pgpool-II-pg14-4.3.0-1pgdg.rhel7.x86_64.rpm
pgpool -v

-- pgpool.confの設定
cp -p /etc/pgpool-II/pgpool.conf /etc/pgpool-II/pgpool.conf.org

vim /etc/pgpool-II/pgpool.conf

全削除して下記を記載
--------

backend_clustering_mode = 'streaming_replication'

listen_addresses = '*'
port = 9999

backend_hostname0 = '192.168.137.122'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/var/lib/pgsql/14/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_application_name0 = 'mmm122'

backend_hostname1 = '192.168.137.123'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/var/lib/pgsql/14/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'
backend_application_name1 = 'mmm123'

load_balance_mode = on

connection_cache = on
num_init_children = 32
max_pool = 4

sr_check_user = 'postgres'
sr_check_password = ''
sr_check_database = 'postgres'

enable_pool_hba = on
pool_passwd = 'pool_passwd'

--------


pg_md5 --md5auth --username=pgpool pgpool
cat /etc/pgpool-II/pool_passwd 

 


-- pg_hba.conf設定

vim  /etc/pgpool-II/pool_hba.conf

追加
host    all         all         192.168.137.0/24          md5
host    all         all         127.0.0.1/24              md5


systemctl restart pgpool
systemctl status pgpool

-- 動作確認

psql -h 192.168.137.121 -p 9999 -U pgpool -d postgres

show pool_nodes;

-- 6. DRサイトのPgpool-Ⅱの設定


-- psqlクライアントのインストール[mmm125]

yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum -y install postgresql14

-- Pgpool-Ⅱのインストール[mmm125]

yum install -y https://www.pgpool.net/yum/rpms/4.3/redhat/rhel-7-x86_64/pgpool-II-pg14-4.3.0-1pgdg.rhel7.x86_64.rpm
pgpool -v

-- pgpool.confの設定
cp -p /etc/pgpool-II/pgpool.conf /etc/pgpool-II/pgpool.conf.org

vim /etc/pgpool-II/pgpool.conf

全削除して下記を記載
--------

backend_clustering_mode = 'streaming_replication'

listen_addresses = '*'
port = 9999

backend_hostname0 = '192.168.137.126'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/var/lib/pgsql/14/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_application_name0 = 'mmm126'

backend_hostname1 = '192.168.137.127'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/var/lib/pgsql/14/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'
backend_application_name1 = 'mmm127'

load_balance_mode = on

connection_cache = on
num_init_children = 32
max_pool = 4

sr_check_user = 'postgres'
sr_check_password = ''
sr_check_database = 'postgres'

enable_pool_hba = on
pool_passwd = 'pool_passwd'
--------

 


pg_md5 --md5auth --username=pgpool pgpool
cat /etc/pgpool-II/pool_passwd 

 


-- pg_hba.conf設定

vim  /etc/pgpool-II/pool_hba.conf

追加
host    all         all         192.168.137.0/24          md5
host    all         all         127.0.0.1/24              md5


systemctl restart pgpool
systemctl status pgpool

-- 動作確認

psql -h 192.168.137.125 -p 9999 -U pgpool -d postgres 

show pool_nodes;

 


(14)
【2】Pgpool-Ⅱクラスタ+サイト間レプリケーション
https://www.pgpool.net/docs/latest/ja/html/example-cluster.html

 

OS: CentOS7
メモリ2G/ディスク60G

pgpool-II version 4.3.0 (tamahomeboshi)

プライマリサイト
mmm121 192.168.137.121 postgreSQL Pgpool-Ⅱ
mmm122 192.168.137.122 postgreSQL Pgpool-Ⅱ
mmm123 192.168.137.123 postgreSQL Pgpool-Ⅱ
Pgpool-Ⅱ VIP 192.168.137.129

DRサイト
mmm124 192.168.137.124 postgreSQL Pgpool-Ⅱ
mmm125 192.168.137.125 postgreSQL Pgpool-Ⅱ
mmm126 192.168.137.126 postgreSQL Pgpool-Ⅱ
Pgpool-Ⅱ VIP 192.168.137.130

サイト間レプリケーション
VIP


mmm124


サイト間レプリケーションレプリケーションスロットを作成しない
サイト間レプリケーション送信元としてプライマリサイトのVIPを使用する


DRサイト内は3台ともスタンバイとなる
DRサイト内はmmm124を固定でプライマリとする

 

 

---------------------------------------------
-- [1] プライマリサイトのPgpool-IIクラスタの構成

 


-- 1. postgreSQLインストール[mmm121,mmm122,mmm123]

-- リポジトリの追加

yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum info -y postgresql14-server


-- インストール
yum install -y epel-release centos-release-scl

yum -y install postgresql14-server postgresql14-contrib postgresql14-devel postgresql14-libs
/usr/pgsql-14/bin/postgres --version

-- DB初期化
export PGSETUP_INITDB_OPTIONS='-E UTF8 --locale=C'
/usr/pgsql-14/bin/postgresql-14-setup initdb


-- DB起動
systemctl start postgresql-14
systemctl status postgresql-14


-- DB接続
su - postgres
psql


-- visudoでpostgresユーザ追加

visudo

postgres ALL=(ALL)  NOPASSWD: ALL

-- postgres OSユーザのパスワード設定
echo postgres | passwd --stdin postgres


-- 2. Pgpool-Ⅱのインストール[mmm121,mmm122,mmm123]

yum install -y https://www.pgpool.net/yum/rpms/4.3/redhat/rhel-7-x86_64/pgpool-II-pg14-4.3.0-1pgdg.rhel7.x86_64.rpm

yum install -y https://www.pgpool.net/yum/rpms/4.3/redhat/rhel-7-x86_64/pgpool-II-pg14-devel-4.3.0-1pgdg.rhel7.x86_64.rpm
yum install -y https://www.pgpool.net/yum/rpms/4.3/redhat/rhel-7-x86_64/pgpool-II-pg14-extensions-4.3.0-1pgdg.rhel7.x86_64.rpm

pgpool -v

 

-- 3. WALを格納するディレクトリの作成[mmm121,mmm122,mmm123]

su - postgres
mkdir /var/lib/pgsql/archivedir


-- 4. ストリーミングレプリケーションの設定[mmm121]

vim $PGDATA/postgresql.conf

listen_addresses = '*'
archive_mode = always
archive_command = 'cp "%p" "/var/lib/pgsql/archivedir/%f"'
max_wal_senders = 10
max_replication_slots = 10
wal_level = replica
hot_standby = on
wal_log_hints = on

 

SET password_encryption = 'scram-sha-256';
CREATE ROLE pgpool WITH LOGIN;
CREATE ROLE repl WITH REPLICATION LOGIN;
\password pgpool
\password repl
\password postgres

GRANT pg_monitor TO pgpool;


vim $PGDATA/pg_hba.conf

host    all             all       192.168.137.0/24       scram-sha-256
host    replication     all       192.168.137.0/24       scram-sha-256


-- 5. パスワードなし接続設定[mmm121,mmm122,mmm123]

cd /root/.ssh
ssh-keygen -t rsa -f id_rsa_pgpool
ssh-copy-id -i id_rsa_pgpool.pub postgres@mmm121
ssh-copy-id -i id_rsa_pgpool.pub postgres@mmm122
ssh-copy-id -i id_rsa_pgpool.pub postgres@mmm123

su - postgres
cd ~/.ssh
ssh-keygen -t rsa -f id_rsa_pgpool
ssh-copy-id -i id_rsa_pgpool.pub postgres@mmm121
ssh-copy-id -i id_rsa_pgpool.pub postgres@mmm122
ssh-copy-id -i id_rsa_pgpool.pub postgres@mmm123


ssh postgres@mmm121 -i ~/.ssh/id_rsa_pgpool hostname
ssh postgres@mmm122 -i ~/.ssh/id_rsa_pgpool hostname
ssh postgres@mmm123 -i ~/.ssh/id_rsa_pgpool hostname

 


su - postgres
vim /var/lib/pgsql/.pgpass

mmm121:5432:replication:repl:repl
mmm122:5432:replication:repl:repl
mmm123:5432:replication:repl:repl
mmm121:5432:postgres:postgres:postgres
mmm122:5432:postgres:postgres:postgres
mmm123:5432:postgres:postgres:postgres

chmod 600  /var/lib/pgsql/.pgpass

 

-- 6. pgpool_node_idファイルの作成[mmm121,mmm122,mmm123]

-- mmm121の場合
echo 0 > /etc/pgpool-II/pgpool_node_id
cat /etc/pgpool-II/pgpool_node_id

-- mmm122の場合
echo 1 > /etc/pgpool-II/pgpool_node_id
cat /etc/pgpool-II/pgpool_node_id

-- mmm123の場合
echo 2 > /etc/pgpool-II/pgpool_node_id
cat /etc/pgpool-II/pgpool_node_id


-- 7. 自動フェイルオーバ用のサンプルスクリプトの設定[mmm121,mmm122,mmm123]

cp -p /etc/pgpool-II/failover.sh{.sample,}
cp -p /etc/pgpool-II/follow_primary.sh{.sample,}
chown postgres:postgres /etc/pgpool-II/{failover.sh,follow_primary.sh}


echo 'pgpool:'`pg_md5 pgpool` >> /etc/pgpool-II/pcp.conf

su - postgres
echo 'localhost:9898:pgpool:pgpool' > ~/.pcppass
chmod 600 ~/.pcppass

 

-- 8. オンラインリカバリ用のサンプルスクリプトの設定[mmm121]

cp -p /etc/pgpool-II/recovery_1st_stage.sample /var/lib/pgsql/14/data/recovery_1st_stage
cp -p /etc/pgpool-II/pgpool_remote_start.sample /var/lib/pgsql/14/data/pgpool_remote_start
chown postgres:postgres /var/lib/pgsql/14/data/{recovery_1st_stage,pgpool_remote_start}

su - postgres
psql template1 -c "CREATE EXTENSION pgpool_recovery"

-- 9. Watchdog用のサンプルスクリプトの設定[mmm121,mmm122,mmm123]

cp -p /etc/pgpool-II/escalation.sh{.sample,}
chown postgres:postgres /etc/pgpool-II/escalation.sh

vim /etc/pgpool-II/escalation.sh

PGPOOLS=(server1 server2 server3)
VIP=192.168.137.150
DEVICE=enp0s8

PGPOOLS=(mmm121 mmm122 mmm123)
VIP=192.168.137.129
DEVICE=ens192

 


-- 10. Pgpool-IIのクライアント認証パスワードファイルの設定[mmm121,mmm122,mmm123]

su - postgres
echo 'postgres' > ~/.pgpoolkey 
chmod 600 ~/.pgpoolkey

pg_enc -m -k ~/.pgpoolkey -u pgpool -p
pg_enc -m -k ~/.pgpoolkey -u postgres -p
cat /etc/pgpool-II/pool_passwd 


-- 11. ログ格納ディレクトリの作成[mmm121,mmm122,mmm123]

mkdir /var/log/pgpool_log/
chown postgres:postgres /var/log/pgpool_log/

 


-- 12. Pgpool-IIの設定[mmm121]

mmm121で設定したファイルをmmm122,mmm123へコピーする

-- 12.1 pgpool.confの設定

cp -p /etc/pgpool-II/pgpool.conf /etc/pgpool-II/pgpool.conf.org

vim /etc/pgpool-II/pgpool.conf
全削除して下記を記載


socket_dir = '/var/run/postgresql'
pcp_socket_dir = '/var/run/postgresql'
wd_ipc_socket_dir = '/var/run/postgresql'

backend_clustering_mode = 'streaming_replication'
listen_addresses = '*'
port = 9999
sr_check_user = 'pgpool'
sr_check_password = ''
health_check_period = 5
health_check_timeout = 30
health_check_user = 'pgpool'
health_check_password = ''
health_check_max_retries = 3

backend_hostname0 = 'mmm121'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/var/lib/pgsql/14/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'

backend_hostname1 = 'mmm122'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/var/lib/pgsql/14/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'

backend_hostname2 = 'mmm123'
backend_port2 = 5432
backend_weight2 = 1
backend_data_directory2 = '/var/lib/pgsql/14/data'
backend_flag2 = 'ALLOW_TO_FAILOVER'
   
backend_application_name0 = 'mmm121'
backend_application_name1 = 'mmm122'
backend_application_name2 = 'mmm123'

failover_command = '/etc/pgpool-II/failover.sh %d %h %p %D %m %H %M %P %r %R %N %S'
follow_primary_command = '/etc/pgpool-II/follow_primary.sh %d %h %p %D %m %H %M %P %r %R'

recovery_user = 'postgres'
recovery_password = ''

recovery_1st_stage_command = 'recovery_1st_stage'

enable_pool_hba = on
use_watchdog = on
delegate_IP = '192.168.137.129'

if_up_cmd = '/usr/bin/sudo /sbin/ip addr add $_IP_$/24 dev ens192 label ens192:0'
if_down_cmd = '/usr/bin/sudo /sbin/ip addr del $_IP_$/24 dev ens192'
arping_cmd = '/usr/bin/sudo /usr/sbin/arping -U $_IP_$ -w 1 -I ens192'


hostname0 = 'mmm121'
wd_port0 = 9000
pgpool_port0 = 9999

hostname1 = 'mmm122'
wd_port1 = 9000
pgpool_port1 = 9999

hostname2 = 'mmm123'
wd_port2 = 9000
pgpool_port2 = 9999

wd_lifecheck_method = 'heartbeat'
wd_interval = 10

heartbeat_hostname0 = 'mmm121'
heartbeat_port0 = 9694
heartbeat_device0 = ''
heartbeat_hostname1 = 'mmm122'
heartbeat_port1 = 9694
heartbeat_device1 = ''
heartbeat_hostname2 = 'mmm123'
heartbeat_port2 = 9694
heartbeat_device2 = ''

wd_heartbeat_keepalive = 2
wd_heartbeat_deadtime = 30

wd_escalation_command = '/etc/pgpool-II/escalation.sh'

log_destination = 'stderr'
logging_collector = on
log_directory = '/var/log/pgpool_log'
log_filename = 'pgpool-%Y-%m-%d_%H%M%S.log'
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 10MB

 

scp -p /etc/pgpool-II/pgpool.conf root@mmm122:/etc/pgpool-II/pgpool.conf
scp -p /etc/pgpool-II/pgpool.conf root@mmm123:/etc/pgpool-II/pgpool.conf

 


-- 12.2 pool_hba.confの設定

cp -p /etc/pgpool-II/pool_hba.conf /etc/pgpool-II/pool_hba.conf.org

vim  /etc/pgpool-II/pool_hba.conf

追加
host    all         pgpool          192.168.137.0/24    scram-sha-256
host    all         postgres        192.168.137.0/24    scram-sha-256

scp -p /etc/pgpool-II/pool_hba.conf root@mmm122:/etc/pgpool-II/pool_hba.conf
scp -p /etc/pgpool-II/pool_hba.conf root@mmm123:/etc/pgpool-II/pool_hba.conf


-- 13. /etc/sysconfig/pgpoolの設定[mmm121,mmm122,mmm123]


vim /etc/sysconfig/pgpool

OPTS=" -n"

OPTS=" -D -n"

 

-- 14. システムの起動と停止[mmm121,mmm122,mmm123]


Pgpool-IIを起動する前に、 PostgreSQLを起動する必要があります。
PostgreSQLを停止する前に、 Pgpool-IIを停止する必要があります。

/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data stop
/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data status
/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data start


systemctl stop pgpool
systemctl status pgpool
systemctl start pgpool


PostgreSQLは全号機起動
Pgpool-Ⅱは全号機起動

PostgreSQLのサービス制御はpg_ctlを使用する


-- 15. PostgreSQL スタンバイサーバを構築[mmm121]
-------------------

pcp_recovery_nodeコマンド実行時、下記のようなエラーが出たため、シェル修正。
ERROR:  recovery is checking if postmaster is started
DETAIL:  postmaster on hostname:"mmm122" database:"template1" user:"postgres" failed to start in 90 second

★シェル修正
su - postgres
vim $PGDATA/pgpool_remote_start


    $PGHOME/bin/pg_ctl -l /dev/null -w -D ${DEST_NODE_PGDATA} status
    if [ $? -eq 0 ]; then
        exit 0
    fi


    $PGHOME/bin/pg_ctl -l /dev/null -w -D ${DEST_NODE_PGDATA} status && exit 0

-------------------

pcp_recovery_node -h 192.168.137.129 -p 9898 -U pgpool -n 1

pcp_recovery_node -h 192.168.137.129 -p 9898 -U pgpool -n 2

 


psql -h 192.168.137.129 -p 9999 -U pgpool postgres -c "show pool_nodes"

 


-- 16. 動作確認

-- 16.1 Watchdogアクティブ/スタンバイの切り替え

pcp_watchdog_info -h 192.168.137.129 -p 9898 -U pgpool

systemctl stop pgpool.service
systemctl status pgpool.service

pcp_watchdog_info -h 192.168.137.129 -p 9898 -U pgpool

systemctl start pgpool.service
systemctl status pgpool.service

pcp_watchdog_info -h 192.168.137.129 -p 9898 -U pgpool


-- 16.2 自動フェイルオーバ

PGPASSWORD=pgpool psql -h 192.168.137.129 -p 9999 -U pgpool postgres -c "show pool_nodes"


su - postgres

/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data -m immediate stop
/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data status

psql -h 192.168.137.129 -p 9999 -U pgpool postgres -c "show pool_nodes"


psql -h 192.168.137.123 -p 5432 -U pgpool postgres -c "select pg_is_in_recovery()"
psql -h 192.168.137.122 -p 5432 -U pgpool postgres -c "select pg_is_in_recovery()"
psql -h 192.168.137.122 -p 5432 -U pgpool postgres -c "select * from pg_stat_replication" -x

 

-- 16.3 オンラインリカバリ

pcp_recovery_node -h 192.168.137.129 -p 9898 -U pgpool -n 0
psql -h 192.168.137.129 -p 9999 -U pgpool postgres -c "show pool_nodes"

 


PGPASSWORD=pgpool psql -h 192.168.137.121 -p 5432 -U pgpool postgres -c "select * from pg_stat_replication" -x
PGPASSWORD=pgpool psql -h 192.168.137.122 -p 5432 -U pgpool postgres -c "select * from pg_stat_replication" -x
PGPASSWORD=pgpool psql -h 192.168.137.123 -p 5432 -U pgpool postgres -c "select * from pg_stat_replication" -x
PGPASSWORD=pgpool psql -h 192.168.137.129 -p 5432 -U pgpool postgres -c "select * from pg_stat_replication" -x

PGPASSWORD=pgpool psql -h 192.168.137.121 -p 5432 -U pgpool postgres -c "select pg_is_in_recovery()"
PGPASSWORD=pgpool psql -h 192.168.137.122 -p 5432 -U pgpool postgres -c "select pg_is_in_recovery()"
PGPASSWORD=pgpool psql -h 192.168.137.123 -p 5432 -U pgpool postgres -c "select pg_is_in_recovery()"
PGPASSWORD=pgpool psql -h 192.168.137.129 -p 5432 -U pgpool postgres -c "select pg_is_in_recovery()"


PGPASSWORD=postgres psql -h 192.168.137.121 -p 5432 -U postgres test -c "select * from tab1"
PGPASSWORD=postgres psql -h 192.168.137.122 -p 5432 -U postgres test -c "select * from tab1"
PGPASSWORD=postgres psql -h 192.168.137.123 -p 5432 -U postgres test -c "select * from tab1"
PGPASSWORD=postgres psql -h 192.168.137.129 -p 5432 -U postgres test -c "select * from tab1"

 


---------------------------------------------
-- [2] DRサイトのPgpool-IIクラスタとサイト間レプリケーションの構成

-- 1. postgreSQLインストール[mmm124,mmm125,mmm126]

-- リポジトリの追加

yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum info -y postgresql14-server


-- インストール
yum install -y epel-release centos-release-scl

yum -y install postgresql14-server postgresql14-contrib postgresql14-devel postgresql14-libs
/usr/pgsql-14/bin/postgres --version

-- DB初期化
export PGSETUP_INITDB_OPTIONS='-E UTF8 --locale=C'
/usr/pgsql-14/bin/postgresql-14-setup initdb

 

-- visudoでpostgresユーザ追加

visudo

postgres ALL=(ALL)  NOPASSWD: ALL

-- postgres OSユーザのパスワード設定
echo postgres | passwd --stdin postgres


-- 2. Pgpool-Ⅱのインストール[mmm124,mmm125,mmm126]

yum install -y https://www.pgpool.net/yum/rpms/4.3/redhat/rhel-7-x86_64/pgpool-II-pg14-4.3.0-1pgdg.rhel7.x86_64.rpm

yum install -y https://www.pgpool.net/yum/rpms/4.3/redhat/rhel-7-x86_64/pgpool-II-pg14-devel-4.3.0-1pgdg.rhel7.x86_64.rpm
yum install -y https://www.pgpool.net/yum/rpms/4.3/redhat/rhel-7-x86_64/pgpool-II-pg14-extensions-4.3.0-1pgdg.rhel7.x86_64.rpm

pgpool -v

 

-- 3. WALを格納するディレクトリの作成[mmm124,mmm125,mmm126]

su - postgres
mkdir /var/lib/pgsql/archivedir

 

-- 4. パスワードなし接続設定[mmm124,mmm125,mmm126]

cd /root/.ssh
ssh-keygen -t rsa -f id_rsa_pgpool
ssh-copy-id -i id_rsa_pgpool.pub postgres@mmm124
ssh-copy-id -i id_rsa_pgpool.pub postgres@mmm125
ssh-copy-id -i id_rsa_pgpool.pub postgres@mmm126

su - postgres
cd ~/.ssh
ssh-keygen -t rsa -f id_rsa_pgpool
ssh-copy-id -i id_rsa_pgpool.pub postgres@mmm124
ssh-copy-id -i id_rsa_pgpool.pub postgres@mmm125
ssh-copy-id -i id_rsa_pgpool.pub postgres@mmm126


ssh postgres@mmm124 -i ~/.ssh/id_rsa_pgpool hostname
ssh postgres@mmm125 -i ~/.ssh/id_rsa_pgpool hostname
ssh postgres@mmm126 -i ~/.ssh/id_rsa_pgpool hostname

 

※サイト間レプリ対応

su - postgres
vim /var/lib/pgsql/.pgpass

mmm124:5432:replication:repl:repl
mmm125:5432:replication:repl:repl
mmm126:5432:replication:repl:repl
mmm124:5432:postgres:postgres:postgres
mmm125:5432:postgres:postgres:postgres
mmm126:5432:postgres:postgres:postgres
192.168.137.129:5432:replication:repl:repl
192.168.137.129:5432:postgres:postgres:postgres

chmod 600  /var/lib/pgsql/.pgpass

 

-- 5. pgpool_node_idファイルの作成[mmm124,mmm125,mmm126]

-- mmm124の場合
echo 0 > /etc/pgpool-II/pgpool_node_id
cat /etc/pgpool-II/pgpool_node_id

-- mmm125の場合
echo 1 > /etc/pgpool-II/pgpool_node_id
cat /etc/pgpool-II/pgpool_node_id

-- mmm126の場合
echo 2 > /etc/pgpool-II/pgpool_node_id
cat /etc/pgpool-II/pgpool_node_id


-- 6. 自動フェイルオーバ用のサンプルスクリプトの設定[mmm124,mmm125,mmm126]

cp -p /etc/pgpool-II/failover.sh{.sample,}
cp -p /etc/pgpool-II/follow_primary.sh{.sample,}
chown postgres:postgres /etc/pgpool-II/{failover.sh,follow_primary.sh}


echo 'pgpool:'`pg_md5 pgpool` >> /etc/pgpool-II/pcp.conf

su - postgres
echo 'localhost:9898:pgpool:pgpool' > ~/.pcppass
chmod 600 ~/.pcppass


-- 7. Watchdog用のサンプルスクリプトの設定[mmm124,mmm125,mmm126]

cp -p /etc/pgpool-II/escalation.sh{.sample,}
chown postgres:postgres /etc/pgpool-II/escalation.sh

vim /etc/pgpool-II/escalation.sh

PGPOOLS=(server1 server2 server3)
VIP=192.168.137.150
DEVICE=enp0s8

PGPOOLS=(mmm124 mmm125 mmm126)
VIP=192.168.137.130
DEVICE=ens192

 


-- 8. Pgpool-IIのクライアント認証パスワードファイルの設定[mmm124,mmm125,mmm126]

su - postgres
echo 'postgres' > ~/.pgpoolkey 
chmod 600 ~/.pgpoolkey

pg_enc -m -k ~/.pgpoolkey -u pgpool -p
pg_enc -m -k ~/.pgpoolkey -u postgres -p
cat /etc/pgpool-II/pool_passwd 


-- 9. ログ格納ディレクトリの作成[mmm124,mmm125,mmm126]

mkdir /var/log/pgpool_log/
chown postgres:postgres /var/log/pgpool_log/

 


-- 10. Pgpool-IIの設定[mmm124]

mmm124で設定したファイルをmmm125,mmm126へコピーする

-- 10.1 pgpool.confの設定

cp -p /etc/pgpool-II/pgpool.conf /etc/pgpool-II/pgpool.conf.org

vim /etc/pgpool-II/pgpool.conf
全削除して下記を記載


socket_dir = '/var/run/postgresql'
pcp_socket_dir = '/var/run/postgresql'
wd_ipc_socket_dir = '/var/run/postgresql'

backend_clustering_mode = 'streaming_replication'
listen_addresses = '*'
port = 9999
sr_check_user = 'pgpool'
sr_check_password = ''
health_check_period = 5
health_check_timeout = 30
health_check_user = 'pgpool'
health_check_password = ''
health_check_max_retries = 3

backend_hostname0 = 'mmm124'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/var/lib/pgsql/14/data'
backend_flag0 = 'ALWAYS_PRIMARY'

backend_hostname1 = 'mmm125'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/var/lib/pgsql/14/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'

backend_hostname2 = 'mmm126'
backend_port2 = 5432
backend_weight2 = 1
backend_data_directory2 = '/var/lib/pgsql/14/data'
backend_flag2 = 'ALLOW_TO_FAILOVER'
   
backend_application_name0 = 'mmm124'
backend_application_name1 = 'mmm125'
backend_application_name2 = 'mmm126'

failover_command = '/etc/pgpool-II/failover.sh %d %h %p %D %m %H %M %P %r %R %N %S'
follow_primary_command = '/etc/pgpool-II/follow_primary.sh %d %h %p %D %m %H %M %P %r %R'

recovery_user = 'postgres'
recovery_password = ''

recovery_1st_stage_command = 'recovery_1st_stage'

enable_pool_hba = on
use_watchdog = on
delegate_IP = '192.168.137.130'

if_up_cmd = '/usr/bin/sudo /sbin/ip addr add $_IP_$/24 dev ens192 label ens192:0'
if_down_cmd = '/usr/bin/sudo /sbin/ip addr del $_IP_$/24 dev ens192'
arping_cmd = '/usr/bin/sudo /usr/sbin/arping -U $_IP_$ -w 1 -I ens192'


hostname0 = 'mmm124'
wd_port0 = 9000
pgpool_port0 = 9999

hostname1 = 'mmm125'
wd_port1 = 9000
pgpool_port1 = 9999

hostname2 = 'mmm126'
wd_port2 = 9000
pgpool_port2 = 9999

wd_lifecheck_method = 'heartbeat'
wd_interval = 10

heartbeat_hostname0 = 'mmm124'
heartbeat_port0 = 9694
heartbeat_device0 = ''
heartbeat_hostname1 = 'mmm125'
heartbeat_port1 = 9694
heartbeat_device1 = ''
heartbeat_hostname2 = 'mmm126'
heartbeat_port2 = 9694
heartbeat_device2 = ''

wd_heartbeat_keepalive = 2
wd_heartbeat_deadtime = 30

wd_escalation_command = '/etc/pgpool-II/escalation.sh'

log_destination = 'stderr'
logging_collector = on
log_directory = '/var/log/pgpool_log'
log_filename = 'pgpool-%Y-%m-%d_%H%M%S.log'
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 10MB

 

scp -p /etc/pgpool-II/pgpool.conf root@mmm125:/etc/pgpool-II/pgpool.conf
scp -p /etc/pgpool-II/pgpool.conf root@mmm126:/etc/pgpool-II/pgpool.conf

 


-- 10.2 pool_hba.confの設定

cp -p /etc/pgpool-II/pool_hba.conf /etc/pgpool-II/pool_hba.conf.org

vim  /etc/pgpool-II/pool_hba.conf

追加
host    all         pgpool          192.168.137.0/24    scram-sha-256
host    all         postgres        192.168.137.0/24    scram-sha-256

scp -p /etc/pgpool-II/pool_hba.conf root@mmm125:/etc/pgpool-II/pool_hba.conf
scp -p /etc/pgpool-II/pool_hba.conf root@mmm126:/etc/pgpool-II/pool_hba.conf


-- 11. /etc/sysconfig/pgpoolの設定[mmm124,mmm125,mmm126]


vim /etc/sysconfig/pgpool

OPTS=" -n"

OPTS=" -D -n"

 


-- 12. PostgreSQL スタンバイサーバ構築

-- 12.1 サイト間レプリケーション設定 [mmm124]

su - postgres
/usr/pgsql-14/bin/pg_ctl -l /dev/null -w -D /var/lib/pgsql/14/data stop

/usr/pgsql-14/bin/pg_ctl -l /dev/null -w -D /var/lib/pgsql/14/data status

rm -rf /var/lib/pgsql/14/data
rm -rf /var/lib/pgsql/archivedir/*
rm -rf /var/lib/pgsql/14/data/pg_replslot/*

/usr/pgsql-14/bin/pg_basebackup -h 192.168.137.129 -U repl -p 5432 -D /var/lib/pgsql/14/data -X stream

sed -i -e "/^include_if_exists = '\/var\/lib\/pgsql\/14\/data\/myrecovery.conf'/d" /var/lib/pgsql/14/data/postgresql.conf


sed -i -e "\$aprimary_conninfo = 'host=192.168.137.129  port=5432 user=repl application_name=mmm124 passfile=''\/var\/lib\/pgsql\/.pgpass'''"  \
       -e  "/^primary_conninfo = .*/d" /var/lib/pgsql/14/data/postgresql.conf

 


touch /var/lib/pgsql/14/data/standby.signal

/usr/pgsql-14/bin/pg_ctl -l /dev/null -w -D /var/lib/pgsql/14/data start

/usr/pgsql-14/bin/pg_ctl -l /dev/null -w -D /var/lib/pgsql/14/data status


-- 12.2 レプリケーション設定[mmm125]

su - postgres
/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data stop

/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data status

rm -rf /var/lib/pgsql/14/data
rm -rf /var/lib/pgsql/archivedir/*
rm -rf /var/lib/pgsql/14/data/pg_replslot/*

/usr/pgsql-14/bin/pg_basebackup -h mmm124 -U repl -p 5432 -D /var/lib/pgsql/14/data -X stream

 

cat > /var/lib/pgsql/14/data/myrecovery.conf << EOT
primary_conninfo = 'host=mmm124 port=5432 user=repl application_name=mmm125 passfile=''/var/lib/pgsql/.pgpass'''
recovery_target_timeline = 'latest'
restore_command = 'scp mmm124:/var/lib/pgsql/archivedir/%f %p'
EOT

sed -i "/^primary_conninfo = 'host=192.168.137.129  port=5432 user=repl application_name=mmm124 passfile=''\/var\/lib\/pgsql\/.pgpass'''/d" /var/lib/pgsql/14/data/postgresql.conf


sed -i -e "\$ainclude_if_exists = '\/var\/lib\/pgsql\/14\/data\/myrecovery.conf'"  \
       -e  "/^include_if_exists = .*/d" /var/lib/pgsql/14/data/postgresql.conf

touch /var/lib/pgsql/14/data/standby.signal

/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data start

/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data status

 

-- 12.3 レプリケーション設定[mmm126]

su - postgres
/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data stop

/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data status

rm -rf /var/lib/pgsql/14/data
rm -rf /var/lib/pgsql/archivedir/*
rm -rf /var/lib/pgsql/14/data/pg_replslot/*

/usr/pgsql-14/bin/pg_basebackup -h mmm124 -U repl -p 5432 -D /var/lib/pgsql/14/data -X stream

 

cat > /var/lib/pgsql/14/data/myrecovery.conf << EOT
primary_conninfo = 'host=mmm124 port=5432 user=repl application_name=mmm126 passfile=''/var/lib/pgsql/.pgpass'''
recovery_target_timeline = 'latest'
restore_command = 'scp mmm124:/var/lib/pgsql/archivedir/%f %p'
EOT

sed -i "/^primary_conninfo = 'host=192.168.137.129  port=5432 user=repl application_name=mmm124 passfile=''\/var\/lib\/pgsql\/.pgpass'''/d" /var/lib/pgsql/14/data/postgresql.conf


sed -i -e "\$ainclude_if_exists = '\/var\/lib\/pgsql\/14\/data\/myrecovery.conf'"  \
       -e  "/^include_if_exists = .*/d" /var/lib/pgsql/14/data/postgresql.conf

touch /var/lib/pgsql/14/data/standby.signal

/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data start

/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data status

 


-- 13. システムの起動と停止[mmm124,mmm125,mmm126]


Pgpool-IIを起動する前に、 PostgreSQLを起動する必要があります。
PostgreSQLを停止する前に、 Pgpool-IIを停止する必要があります。

/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data stop
/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data status
/usr/pgsql-14/bin/pg_ctl -w -D /var/lib/pgsql/14/data start


systemctl stop pgpool
systemctl status pgpool
systemctl start pgpool


PostgreSQLは全号機起動
Pgpool-Ⅱは全号機起動

PostgreSQLのサービス制御はpg_ctlを使用する


PGPASSWORD=pgpool psql -h 192.168.137.130 -p 9999 -U pgpool postgres -c "show pool_nodes"

→3台ともスタンバイ
pcp_watchdog_info -h 192.168.137.130 -p 9898 -U pgpool


PGPASSWORD=pgpool psql -h 192.168.137.124 -p 5432 -U pgpool postgres -c "select * from pg_stat_replication" -x
PGPASSWORD=pgpool psql -h 192.168.137.125 -p 5432 -U pgpool postgres -c "select * from pg_stat_replication" -x
PGPASSWORD=pgpool psql -h 192.168.137.126 -p 5432 -U pgpool postgres -c "select * from pg_stat_replication" -x
PGPASSWORD=pgpool psql -h 192.168.137.130 -p 5432 -U pgpool postgres -c "select * from pg_stat_replication" -x

PGPASSWORD=pgpool psql -h 192.168.137.124 -p 5432 -U pgpool postgres -c "select pg_is_in_recovery()"
PGPASSWORD=pgpool psql -h 192.168.137.125 -p 5432 -U pgpool postgres -c "select pg_is_in_recovery()"
PGPASSWORD=pgpool psql -h 192.168.137.126 -p 5432 -U pgpool postgres -c "select pg_is_in_recovery()"
PGPASSWORD=pgpool psql -h 192.168.137.130 -p 5432 -U pgpool postgres -c "select pg_is_in_recovery()"


PGPASSWORD=postgres psql -h 192.168.137.124 -p 5432 -U postgres test -c "select * from tab1"
PGPASSWORD=postgres psql -h 192.168.137.125 -p 5432 -U postgres test -c "select * from tab1"
PGPASSWORD=postgres psql -h 192.168.137.126 -p 5432 -U postgres test -c "select * from tab1"
PGPASSWORD=postgres psql -h 192.168.137.130 -p 5432 -U postgres test -c "select * from tab1"


-- PostgreSQL再起動後、show pool_nodesでstatusがdownとなる。これを復旧するコマンド

pcp_attach_node -h 192.168.137.130 -p 9898 -U pgpool -n 1
pcp_attach_node -h 192.168.137.130 -p 9898 -U pgpool -n 2

 

 

(2019)

【1】Always On Failover Cluster Instance + Always On 可用性グループ
https://docs.microsoft.com/ja-jp/sql/database-engine/availability-groups/windows/failover-clustering-and-always-on-availability-groups-sql-server?view=sql-server-ver15
https://docs.microsoft.com/ja-jp/previous-versions/sql/sql-server-2012/jj215886(v=msdn.10)
https://www.mssqltips.com/sqlservertip/4967/fixing-error-19405-when-configuring-sql-server-availability-groups/


OS:Windows Server2019
メモリ4G/ディスク60G

mmm191 (プライマリサイト ドメインコントローラ,iSCSIターゲット) 192.168.137.191
mmm192 (プライマリサイト アクティブ) 192.168.137.192
mmm193 (プライマリサイト スタンバイ) 192.168.137.193
mmm194 (DRサイト ドメインコントローラ,iSCSIターゲット) 192.168.137.194
mmm195 (DRサイト アクティブ) 192.168.137.195
mmm196 (DRサイト スタンバイ) 192.168.137.196

ルートドメイン名 contoso.local  (プライマリサイトとDRサイトで共通)
NetBIOSドメイン名 CONTOSO       (プライマリサイトとDRサイトで共通)
クラスタ名 mycluster        (プライマリサイトとDRサイトで共通)
クラスタIP 192.168.137.197  (プライマリサイトとDRサイトで共通)
プライマリサイト SQL Serverのネットワーク名 network01
プライマリサイト SQL ServerのVIP 192.168.137.198
DRサイト SQL Serverのネットワーク名 network02
DRサイト SQL ServerのVIP 192.168.137.199
可用性グループリスナーのDNS名  testlistener
可用性グループリスナーIP  192.168.137.200


※すでにクラスターに参加しているホストは別のクラスターに参加できない


---------------------------------------------
-- [1] プライマリサイトのAlways On Failover Cluster Instanceの構成


mmm191 (プライマリサイト ドメインコントローラ,iSCSIターゲット) 192.168.137.191
mmm192 (プライマリサイト アクティブ) 192.168.137.192
mmm193 (プライマリサイト スタンバイ) 192.168.137.193

ルートドメイン名 contoso.local  (プライマリサイトとDRサイトで共通)
NetBIOSドメイン名 CONTOSO       (プライマリサイトとDRサイトで共通)
クラスタ名 mycluster        (プライマリサイトとDRサイトで共通)
クラスタIP 192.168.137.197  (プライマリサイトとDRサイトで共通)

SQL Serverのネットワーク名 network01
SQL ServerのVIP 192.168.137.198


1. ActiveDirecotryのインストール[mmm191]
  サーバの役割の追加から「ActiveDirecotryドメインサービス」を追加
  「このサーバーをドメインコントローラーに昇格する」で、ドメインコントローラーに昇格

2. ドメインへの参加[mmm192,mmm193]
  mmm192,mmm193のDNSとしてADマシンのIPを指定
  システムのプロパティからドメインに参加

3. SQL Server実行ユーザーの作成[mmm191]
  ActiveDirectoryユーザーとコンピューターから、ユーザー(sqlservice)を追加


4. iSCSIターゲットの構成[mmm191]
  iSCSIターゲットサーバー役割サービスをインストールする
  iSCSI仮想ディスクを追加し、iSCSIターゲットを構成する

  Cドライブから以下を割り当てる
  DISK1: クォーラムディスク 1GB 容量固定

  ターゲット名: target01
  接続許可:mmm192,mmm193
  
  ターゲット作成後、下記iSCSI仮想ディスクを追加
  DISK2: 共有ディスク 30GB 容量固定


5. iSCSIイニシエーターの構成[mmm192,mmm193]

  コントロールパネルの小さいアイコンから「iSCSIイニシエーター」を選択
  mmm191のIPアドレスを入力して、クイック接続

  コンピュータの管理からiSCSI仮想ディスクを初期化して、シンプルボリュームを作成

  ※ドライブレターはプライマリとDRで一致させる

  DISK1 → E
  DISK2 → F

 

6. フェールオーバークラスタリングの追加[mmm192,mmm193]
  役割と機能の追加で、フェールオーバークラスタリングを追加
  フェールオーバークラスター構成の検証
  フェールオーバークラスター構成の作成
  ※「使用可能な記憶域をすべてクラスターに追加する」をチェックする
  →DISK1とDISK2が共有ディスクとして設定される


7. SQL Serverフェールオーバークラスターのインストール[mmm192]

  機能の選択: データベースエンジンサービス
  名前付きインスタンス: instance01
  インスタンスID: instance01


  SQL ServerエージェントとSQL Serverデータベースエンジンのアカウント名: contoso\sqlservice
  「SQL Serverデータベースエンジンサービスにボリュームメンテナンスタスクを実行する特権を付与する」をチェックする
  認証モード: 混合認証モード
  SQL Server管理者: CONTOSO\administrator
  データルートディレクトリ: F:\
  メモリ: 推奨


8. SQL Serverフェールオーバークラスターのノード追加[mmm193]

 

9. 接続確認
sqlcmd -S 192.168.137.198\instance01

 

---------------------------------------------
-- [2] DRサイトのAlways On Failover Cluster Instanceの構成

 

mmm194 (DRサイト ドメインコントローラ,iSCSIターゲット) 192.168.137.194
mmm195 (DRサイト アクティブ) 192.168.137.195
mmm196 (DRサイト スタンバイ) 192.168.137.196

ルートドメイン名 contoso.local  (プライマリサイトとDRサイトで共通)
NetBIOSドメイン名 CONTOSO       (プライマリサイトとDRサイトで共通)
クラスタ名 mycluster        (プライマリサイトとDRサイトで共通)
クラスタIP 192.168.137.197  (プライマリサイトとDRサイトで共通)

SQL Serverのネットワーク名 network02
SQL ServerのVIP 192.168.137.199


1. ActiveDirecotryのインストール[mmm194]
  サーバの役割の追加から「ActiveDirecotryドメインサービス」を追加
  DNSとしてmmm191のIPを指定
  「このサーバーをドメインコントローラーに昇格する」で、ドメインコントローラーとして既存ドメインに追加

2. ドメインへの参加[mmm195,mmm196]
  mmm195,mmm196のDNSとしてmmm194のIPを指定
  システムのプロパティからドメインに参加

 

3. iSCSIターゲットの構成[mmm194]
  iSCSIターゲットサーバー役割サービスをインストールする
  iSCSI仮想ディスクを追加し、iSCSIターゲットを構成する

  Cドライブから以下を割り当てる
  DISK1: クォーラムディスク 1GB 容量固定
  ↑作成はするが使用しない

  ターゲット名: target02
  接続許可:mmm195,mmm196
  
  ターゲット作成後、下記iSCSI仮想ディスクを追加
  DISK2: 共有ディスク 30GB 容量固定


4. iSCSIイニシエーターの構成[mmm195,mmm196]

  コントロールパネルの小さいアイコンから「iSCSIイニシエーター」を選択
  mmm194のIPアドレスを入力して、クイック接続

  コンピュータの管理からiSCSI仮想ディスクを初期化して、シンプルボリュームを作成

  ※ドライブレターはプライマリとDRで一致させる

  DISK1 → E
  DISK2 → F


5. フェールオーバークラスタリングの追加[mmm195,mmm196]
  役割と機能の追加で、フェールオーバークラスタリングを追加
  フェールオーバークラスター構成の検証
  
  ※既存のクラスターmyclusterに接続してノード追加
  
  ※「使用可能な記憶域をすべてクラスターに追加する」をチェックする
  →DISK1とDISK2が共有ディスクとして設定される


6. Set the NodeWeight of the disaster recovery data center WSFC nodes to a 0 (zero) weight[mmm195]

Get-ClusterNode | fl NodeName, NodeWeight

(Get-ClusterNode "mmm195").NodeWeight=0
(Get-ClusterNode "mmm196").NodeWeight=0

Get-ClusterNode | fl NodeName, NodeWeight


7. SQL Serverフェールオーバークラスターのインストール[mmm195]

  ※クラスター構成の検証でエラーがあるとされた場合、再度構成の検証を行う


  機能の選択: データベースエンジンサービス
  名前付きインスタンス: instance02
  インスタンスID: instance02

 

  SQL ServerエージェントとSQL Serverデータベースエンジンのアカウント名: contoso\sqlservice
  「SQL Serverデータベースエンジンサービスにボリュームメンテナンスタスクを実行する特権を付与する」をチェックする
  認証モード: 混合認証モード
  SQL Server管理者: CONTOSO\administrator
  データルートディレクトリ: F:\
  メモリ: 推奨


8. SQL Serverフェールオーバークラスターのノード追加[mmm196]

  ※ instance02が選択リストに表示されない場合、役割「instance01」を一時的に停止する


9. 接続確認
sqlcmd -S 192.168.137.199\instance02

 

 

 

---------------------------------------------
-- [3] Always On 可用性グループの構成


Always On 可用性グループ

リスナーのDNS名  testlistener
リスナーIP  192.168.137.200
リスナーポート  1433
DB名  testdb
可用性グループ名  testag

※可用性グループのプロパティ (たとえば、有効な所有者、優先所有者) を変更しないでください。
これらのプロパティは、可用性グループによって自動的に設定されます

※フェールオーバー クラスター マネージャーを使用して可用性グループを他のノードに移動したり
可用性グループをフェールオーバーしたりしないでください。 


1. SSMSインストール[mmm192,mmm195]

https://docs.microsoft.com/ja-jp/sql/ssms/download-sql-server-management-studio-ssms?redirectedfrom=MSDN&view=sql-server-ver15

  日本語版をインストール

 

2. 優先所有者と実行可能な所有者の設定[mmm192]

  フェールオーバークラスターマネージャ

  左ペインで役割を選択、上ペインでINSTANCE01を選択して右クリック→プロパティ
  優先所有者: mmm192

  左ペインで役割を選択、上ペインでINSTANCE02を選択して右クリック→プロパティ
  優先所有者: mmm195


  左ペインで役割を選択、上ペインでINSTANCE01を選択、下ペインのリソースタブで各種リソースを右クリック→プロパティ→詳細なポリシー
  実行可能な所有者: mmm192,mmm193

  左ペインで役割を選択、上ペインでINSTANCE02を選択、下ペインのリソースタブで各種リソースを右クリック→プロパティ→詳細なポリシー
  実行可能な所有者: mmm195,mmm196


  ※各種リソース→ サーバー名、その他のリソース、役割、記憶域

  ※設定していない場合、可用性グループ作成時に下記のようなエラーがでる
  可用性グループ 'testag' の作成、結合、またはレプリカ追加に失敗しました。
  ノード 'MMM195' が、レプリカ 'NETWORK01\INSTANCE01' および 'NETWORK02\INSTANCE03' の
  両方に対して実行可能な所有者であるためです。
  1 つのレプリカがフェールオーバー クラスタインスタンスである場合は、
  実行可能な所有者から重複するノードを削除して再実行してください。
   (Microsoft SQL Server、エラー: 19405)

 


3. AlwaysOn可用性グループの有効化[mmm192,mmm195]
  SQLサーバ構成マネージャのSQL Serverのプロパティ画面でAlwaysOn可用性グループの有効化を行う
  SQL Server再起動(再起動はクラスターマネージャの役割の停止→役割の開始で行う

 


4. データおよびログファイル格納場所の作成[mmm192,mmm195]
  データおよびログファイルの保存フォルダ作成(F:\SQL_AO_Data)
  sqlserviceユーザーの読み書き権限を付与

 

5. バックアップデータ共有フォルダの設定[mmm192]
  初期データを同期するための共有フォルダを作成(C:\SQL_AO_Share)
  共有許可し、sqlserviceユーザーの読み書き権限を付与

 

6. DBの作成[mmm192]
  データとログの保存位置→F:\SQL_AO_Data\

 

7. DBのバックアップ[mmm192]
  バックアップ保存先→C:\SQL_AO_Share\testdb.bak

 

8. 可用性グループの作成[mmm192]
  SSMSのAlways On高可用性から「新しい可用性グループウイザード」を起動
  クラスターの種類: Windows Server フェールオーバークラスタ
  データベースレベルの正常性検出  YES
  データベースごとのDTCサポート  NO
  データベースを選択
  レプリカの追加でNETWORK02\INSTANCE02を追加
  自動フェールオーバー  NO    ※自動フェイルオーバーは不可
  可用性モード  非同期コミット
  読み取り可能なセカンダリ  YES
  データの同期設定では、「完全なデータベースとログバックアップ」を選択
  ファイル共有のパス: \\MMM192\SQL_AO_Share


9. 可用性グループへの結合[mmm195]
  レプリカ側で「DBが復元しています」のままの場合
  可用性データベースから「可用性グループへの結合」を実施


10. リスナー追加[mmm192]
  リスナー追加のウイザードを開く

 

11. 包含データベースの設定[mmm192,mmm195]
  SQL Server全体のプロパティにて、「包含データベース」を"true"にします


12. 包含データベースの設定[mmm192]
  DBのプロパティにて「包含の種類」を"部分"に設定

  ※ロックエラーとなる場合、一度SSMSを閉じて再接続してから実行
  
13. 包含データベースユーザの作成[mmm192]
  データベースのセキュリティ、ユーザーから、新しいユーザーを追加(パスワードが設定されたSQLユーザー)

 

14. 接続確認
sqlcmd -S 192.168.137.200 -U user01 -d testdb -P password

 

select * from sys.availability_groups;
select * from sys.availability_replicas;

select * from sys.dm_hadr_availability_group_states;
select * from sys.dm_hadr_availability_replica_states;
select * from sys.dm_hadr_database_replica_states;
select * from sys.dm_hadr_database_replica_cluster_states;

select * from sys.dm_hadr_cluster;
select * from sys.dm_hadr_cluster_members;

 

【2】分散型可用性グループ
https://docs.microsoft.com/ja-jp/sql/database-engine/availability-groups/windows/distributed-availability-groups?view=sql-server-ver15
https://blog.engineer-memo.com/2016/04/24/sql-server-2016-rc3-%E3%81%AE%E5%88%86%E6%95%A3%E5%8F%AF%E7%94%A8%E6%80%A7%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/

 

OS:Windows Server2019
メモリ4G/ディスク60G

mmm191 (ドメインコントローラ) 192.168.137.191
mmm192 (プライマリサイト アクティブ) 192.168.137.192
mmm193 (プライマリサイト スタンバイ) 192.168.137.193

mmm195 (DRサイト アクティブ) 192.168.137.195
mmm196 (DRサイト スタンバイ) 192.168.137.196

ルートドメイン名 contoso.local  (プライマリサイトとDRサイトで共通)
NetBIOSドメイン名 CONTOSO       (プライマリサイトとDRサイトで共通)

プライマリサイト クラスタ名 cluster01
プライマリサイト クラスタIP 192.168.137.197
DRサイト クラスタ名 cluster02
DRサイト クラスタIP 192.168.137.198


プライマリサイト 可用性グループリスナーのDNS名  listener01
プライマリサイト 可用性グループリスナーIP  192.168.137.199
プライマリサイト 可用性グループリスナーポート  1433
DRサイト 可用性グループリスナーのDNS名  listener02
DRサイト 可用性グループリスナーIP  192.168.137.200
DRサイト可用性グループリスナーポート  1433

DB名  testdb
プライマリサイト 可用性グループ名  ag1
DRサイト  可用性グループ名  ag2
分散型可用性グループ名 distributedag

---------------------------------------------
-- [1] プライマリサイトのAlways On 可用性グループの構成

 

1. ActiveDirecotryのインストール[mmm191]
  サーバの役割の追加から「ActiveDirecotryドメインサービス」を追加
  「このサーバーをドメインコントローラーに昇格する」で、ドメインコントローラーに昇格

2. ドメインへの参加[mmm192,mmm193]
  mmm192,mmm193のDNSとしてADマシンのIPを指定
  システムのプロパティからドメインに参加

3. SQL Server実行ユーザーの作成[mmm191]
  ActiveDirectoryユーザーとコンピューターから、ユーザー(sqlservice)を追加


4. フェールオーバークラスタリングの追加[mmm192,mmm193]
  役割と機能の追加で、フェールオーバークラスタリングを追加
  フェールオーバークラスター構成の検証
  フェールオーバークラスター構成の作成


5. SQLサーバのインストール[mmm192,mmm193]

  機能の選択: データベースエンジンサービス
  インスタンス: 規定のインスタンス
  SQL ServerエージェントとSQL Serverデータベースエンジンのアカウント名: contoso\sqlservice
  「SQL Serverデータベースエンジンサービスにボリュームメンテナンスタスクを実行する特権を付与する」をチェックする
  認証モード: 混合認証モード
  SQL Server管理者: CONTOSO\administrator
  メモリ: 推奨

6. SSMSインストール[mmm192,mmm193]

https://docs.microsoft.com/ja-jp/sql/ssms/download-sql-server-management-studio-ssms?redirectedfrom=MSDN&view=sql-server-ver15

  日本語版をインストール


7. AlwaysOn可用性グループの有効化[mmm192,mmm193]
  SQLサーバ構成マネージャのSQL Serverのプロパティ画面でAlwaysOn可用性グループの有効化を行う
  SQL Server再起動

 

8. エンドポイントの作成[mmm192,mmm193]

※mmm192,mmm193のそれぞれで実行

CREATE LOGIN [contoso\sqlservice] FROM WINDOWS;

CREATE ENDPOINT [Hadr_endpoint]
STATE = STARTED
AS TCP (LISTENER_PORT = 5022)
FOR DATA_MIRRORING (ROLE = ALL, ENCRYPTION = REQUIRED ALGORITHM AES);

GRANT CONNECT ON ENDPOINT::[Hadr_endpoint] TO [contoso\sqlservice];

GO


9. DBの作成[mmm192]

CREATE DATABASE testdb;
BACKUP DATABASE testdb TO DISK=N'NUL';
GO


10. 可用性グループの作成[mmm192]

CREATE AVAILABILITY GROUP [ag1]
WITH (AUTOMATED_BACKUP_PREFERENCE = SECONDARY,
DB_FAILOVER = ON,
DTC_SUPPORT = NONE,
REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT = 0)
FOR DATABASE [testdb]
REPLICA ON
N'mmm192' WITH (ENDPOINT_URL = N'TCP://mmm192.contoso.local:5022',
    FAILOVER_MODE = MANUAL,
    AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
    BACKUP_PRIORITY = 50,
    SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL),
    SEEDING_MODE = AUTOMATIC),
N'mmm193' WITH (ENDPOINT_URL = N'TCP://mmm193.contoso.local:5022',
    FAILOVER_MODE = MANUAL,
    AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
    BACKUP_PRIORITY = 50,
    SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL),
    SEEDING_MODE = AUTOMATIC);
GO

11. 可用性グループリスナーの作成[mmm192]

ALTER AVAILABILITY GROUP [ag1]
ADD LISTENER N'listener01' ( WITH IP ( (N'192.168.137.199', N'255.255.255.0') ), PORT=1433);

ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;
GO

12. 可用性グループに参加[mmm193]

ALTER AVAILABILITY GROUP [ag1] JOIN;
ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;
GO

 

---------------------------------------------
-- [2] DRサイトのAlways On 可用性グループの構成

 


1. ドメインへの参加[mmm195,mmm196]
  mmm195,mmm196のDNSとしてADマシンのIPを指定
  システムのプロパティからドメインに参加


2. フェールオーバークラスタリングの追加[mmm195,mmm196]
  役割と機能の追加で、フェールオーバークラスタリングを追加
  フェールオーバークラスター構成の検証
  フェールオーバークラスター構成の作成


3. SQLサーバのインストール[mmm195,mmm196]

  機能の選択: データベースエンジンサービス
  インスタンス: 規定のインスタンス
  SQL ServerエージェントとSQL Serverデータベースエンジンのアカウント名: contoso\sqlservice
  「SQL Serverデータベースエンジンサービスにボリュームメンテナンスタスクを実行する特権を付与する」をチェックする
  認証モード: 混合認証モード
  SQL Server管理者: CONTOSO\administrator
  メモリ: 推奨


4. SSMSインストール[mmm195,mmm196]

https://docs.microsoft.com/ja-jp/sql/ssms/download-sql-server-management-studio-ssms?redirectedfrom=MSDN&view=sql-server-ver15

  日本語版をインストール


5. AlwaysOn可用性グループの有効化[mmm195,mmm196]
  SQLサーバ構成マネージャのSQL Serverのプロパティ画面でAlwaysOn可用性グループの有効化を行う
  SQL Server再起動

 


6. エンドポイントの作成[mmm195,mmm196]

※mmm195,mmm196のそれぞれで実行

CREATE LOGIN [contoso\sqlservice] FROM WINDOWS;

CREATE ENDPOINT [Hadr_endpoint]
STATE = STARTED
AS TCP (LISTENER_PORT = 5022)
FOR DATA_MIRRORING (ROLE = ALL, ENCRYPTION = REQUIRED ALGORITHM AES);

GRANT CONNECT ON ENDPOINT::[Hadr_endpoint] TO [contoso\sqlservice];

GO

 

 

7. 可用性グループの作成[mmm195]

CREATE AVAILABILITY GROUP [ag2]
WITH (AUTOMATED_BACKUP_PREFERENCE = SECONDARY,
DB_FAILOVER = ON,
DTC_SUPPORT = NONE,
REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT = 0)
FOR
REPLICA ON
N'mmm195' WITH (ENDPOINT_URL = N'TCP://mmm195.contoso.local:5022',
    FAILOVER_MODE = MANUAL,
    AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
    BACKUP_PRIORITY = 50,
    SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL),
    SEEDING_MODE = AUTOMATIC),
N'mmm196' WITH (ENDPOINT_URL = N'TCP://mmm196.contoso.local:5022',
    FAILOVER_MODE = MANUAL,
    AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
    BACKUP_PRIORITY = 50,
    SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL),
    SEEDING_MODE = AUTOMATIC);
GO

8. 可用性グループリスナーの作成[mmm195]

ALTER AVAILABILITY GROUP [ag2]
ADD LISTENER N'listener02' ( WITH IP ( (N'192.168.137.200', N'255.255.255.0') ), PORT=1433);

ALTER AVAILABILITY GROUP [ag2] GRANT CREATE ANY DATABASE;
GO

9. 可用性グループに参加[mmm196]

ALTER AVAILABILITY GROUP [ag2] JOIN;
ALTER AVAILABILITY GROUP [ag2] GRANT CREATE ANY DATABASE;
GO

 

---------------------------------------------
-- [3] 分散型可用性グループの構成

1. 分散型可用性グループの作成[mmm192]


CREATE AVAILABILITY GROUP [distributedag]
 WITH (DISTRIBUTED)
 AVAILABILITY GROUP ON
N'ag1' WITH
   (
 LISTENER_URL = N'tcp://listener01.contoso.local:5022',
 AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
 FAILOVER_MODE = MANUAL,
 SEEDING_MODE = AUTOMATIC
 ),
N'ag2' WITH
(
 LISTENER_URL = N'tcp://listener02.contoso.local:5022',
 AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
 FAILOVER_MODE = MANUAL,
 SEEDING_MODE = AUTOMATIC
 );
GO


2. 分散型可用性グループに参加[mmm195]

ALTER AVAILABILITY GROUP [distributedag]
 JOIN
 AVAILABILITY GROUP ON
N'ag1' WITH
   (
 LISTENER_URL = N'tcp://listener01.contoso.local:5022',
 AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
 FAILOVER_MODE = MANUAL,
 SEEDING_MODE = AUTOMATIC
 ),
N'ag2' WITH
(
 LISTENER_URL = N'tcp://listener02.contoso.local:5022',
 AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
 FAILOVER_MODE = MANUAL,
 SEEDING_MODE = AUTOMATIC
 );
GO


※当初リスナー名に誤りがありDRサイトが同期できなかった。SQL実行自体は正常終了していた。