MySQLのレプリケーション機能を使うとどのような動きをするのかを確認中。
テストデータのインサートと確認を行うためのスクリプトを作成した。
標準で用意されているデータベース「test」内にテーブル「testtable」を作成して、そこにデータを投入することにした。
3 | mysql> create table testtable ( |
4 | id int(20) not null auto_increment, |
5 | name char(100) default '' not null, |
6 | text char(255) default '', |
9 | mysql> grant all on test.* to テストユーザ名@ホスト名 identified by 'パスワード'; |
スクリプトはperl。
perl-DBD-MySQLパッケージをインストールしておくこと。
5 | my $mysqluser="MySQL内のユーザ名"; |
6 | my $mysqlpassword="パスワード"; |
7 | my $masterserver="マスタサーバ名"; |
8 | my $slaveserver="スレーブサーバ名"; |
10 | my $tablename="testtable"; |
14 | my($server,$user,$password,$dbname,$tablename)=@_; |
15 | my $db=DBI->connect("DBI:mysql:$dbname:$server",$user,$password); |
16 | my $sth=$db->prepare("select id,name,text from $tablename order by id desc"); |
18 | print "\tname\ttext\n"; |
20 | for(my $i=0; $i<$sth->rows; $i++){ |
21 | my @tmp=$sth->fetchrow_array; |
23 | print $tmp[0] ."\t". $tmp[1] ."\t". $tmp[2] ."\n"; |
32 | my($server,$user,$password,$dbname,$tablename)=@_; |
33 | my $db=DBI->connect("DBI:mysql:$dbname:$server",$user,$password); |
34 | my $str1=substr("00".rand(100),-3); |
36 | my $sth=$db->prepare("insert into $tablename values (NULL,'name$str1','$str2')"); |
43 | print "=== insert ===\n"; |
44 | insertvalue($masterserver,$mysqluser,$mysqlpassword,$dbname,$tablename); |
47 | print "=== master:$masterserver ===\n"; |
48 | getselect($masterserver,$mysqluser,$mysqlpassword,$dbname,$tablename); |
50 | print "=== slave:$slaveserver ===\n"; |
51 | getselect($slaveserver,$mysqluser,$mysqlpassword,$dbname,$tablename); |
使い方
情報確認のみ「mysqltest.pl」
データ追加と情報確認「mysqltest.pl ins」
オプションとして「ins」(insert)を指定すると、データを追加する、というもの。
実行すると以下の様な形となる。
5 | 248 name284 Fri Jun 20 11:42:01 2014 |
6 | 247 name563 Fri Jun 20 11:35:01 2014 |
7 | 246 name934 Fri Jun 20 11:28:01 2014 |
8 | 245 name769 Fri Jun 20 11:21:01 2014 |
9 | 244 name227 Fri Jun 20 11:14:01 2014 |
12 | 248 name284 Fri Jun 20 11:42:01 2014 |
13 | 247 name563 Fri Jun 20 11:35:01 2014 |
14 | 246 name934 Fri Jun 20 11:28:01 2014 |
15 | 245 name769 Fri Jun 20 11:21:01 2014 |
16 | 244 name227 Fri Jun 20 11:14:01 2014 |
「単純増加する数字 name+ランダム数字 日付」という出力内容のうち、最新の5件のみ表示する、というものになっている。
マスタサーバの出力内容と、スレーブサーバの出力内容を比べる、というもの。
2021/05/19
postgresql環境でのバックアップ試験のためにこのスクリプトを流用しようとしたところ、作り直しが必要なポイントがあった。
まずはテーブル作成時の違い
1 | create table testtable ( |
2 | id int(20) not null auto_increment, |
3 | name char(100) default '' not null, |
4 | text char(255) default '', |
これをそのまま実行すると下記エラーになる
1 | ERROR: syntax error at or near "(" |
2 | LINE 2: id int(20) not null auto_increment, |
int型auto_increment属性というのはMySQL特有で、postgresqlではserial型で置き換える。
「int(20) auto_increment」→「serial」に変更すると、以下のようになる。
1 | create table testtable ( |
3 | name char(100) default '' not null, |
4 | text char(255) default '', |
また、perlモジュールは DBD:mysqlではなくDBD:Pgに変更になり、データベースとホスト指定手法が変わった。
パッケージとしては perl-DBD-Pg をインストールする。
5 | my $mysqluser="postgresql内のユーザ名"; |
6 | my $mysqlpassword="パスワード"; |
7 | my $masterserver="マスタサーバ名"; |
8 | my $slaveserver="スレーブサーバ名"; |
10 | my $tablename="testtable"; |
14 | my($server,$user,$password,$dbname,$tablename)=@_; |
15 | my $db=DBI->connect("DBI:Pg:dbname=$dbname;host=$server",$user,$password); |
16 | my $sth=$db->prepare("select id,name,text from $tablename order by id desc"); |
18 | print "\tname\ttext\n"; |
20 | for(my $i=0; $i<$sth->rows; $i++){ |
21 | my @tmp=$sth->fetchrow_array; |
23 | print $tmp[0] ."\t". $tmp[1] ."\t". $tmp[2] ."\n"; |
32 | my($server,$user,$password,$dbname,$tablename)=@_; |
33 | my $db=DBI->connect("DBI:Pg:dbname=$dbname;host=$server",$user,$password); |
34 | my $str1=substr("00".rand(100),-3); |
36 | my $sth=$db->prepare("insert into $tablename (name, text) values ('name$str1','$str2')"); |
43 | print "=== insert ===\n"; |
44 | insertvalue($masterserver,$mysqluser,$mysqlpassword,$dbname,$tablename); |
47 | print "=== postgresql:$masterserver ===\n"; |
48 | getselect($masterserver,$mysqluser,$mysqlpassword,$dbname,$tablename); |
50 | print "=== slave:$slaveserver ===\n"; |
51 | getselect($slaveserver,$mysqluser,$mysqlpassword,$dbname,$tablename); |