MySQLとpostgresqlでのレプリケーション動作検証時使用perlスクリプト

MySQLのレプリケーション機能を使うとどのような動きをするのかを確認中。

テストデータのインサートと確認を行うためのスクリプトを作成した。

標準で用意されているデータベース「test」内にテーブル「testtable」を作成して、そこにデータを投入することにした。

1# mysql -u root
2mysql> use test;
3mysql> create table testtable (
4    id int(20) not null auto_increment,
5    name char(100) default '' not null,
6    text char(255) default '',
7    primary key (id)
8);
9mysql> grant all on test.* to テストユーザ名@ホスト名 identified by 'パスワード';
10mysql>

スクリプトはperl。
perl-DBD-MySQLパッケージをインストールしておくこと。

1#!/usr/bin/perl
2 
3use DBI;
4 
5my $mysqluser="MySQL内のユーザ名";
6my $mysqlpassword="パスワード";
7my $masterserver="マスタサーバ名";
8my $slaveserver="スレーブサーバ名";
9my $dbname="test";
10my $tablename="testtable";
11$max=5;
12 
13sub getselect{
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");
17    $sth->execute;
18    print "\tname\ttext\n";
19    my $count=$max;
20    for(my $i=0; $i<$sth->rows; $i++){
21        my @tmp=$sth->fetchrow_array;
22        if($count>0){
23            print $tmp[0] ."\t". $tmp[1] ."\t". $tmp[2] ."\n";
24            $count--;
25        }
26    }
27    $sth->finish;
28    $db->disconnect;
29}
30 
31sub insertvalue{
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);
35    my $str2=localtime();
36    my $sth=$db->prepare("insert into $tablename values (NULL,'name$str1','$str2')");
37    $sth->execute;
38    $sth->finish;
39    $db->disconnect;
40}
41 
42if($ARGV[0] =~ /ins/){
43    print "=== insert ===\n";
44    insertvalue($masterserver,$mysqluser,$mysqlpassword,$dbname,$tablename);
45}
46 
47print "=== master:$masterserver ===\n";
48getselect($masterserver,$mysqluser,$mysqlpassword,$dbname,$tablename);
49 
50print "=== slave:$slaveserver ===\n";
51getselect($slaveserver,$mysqluser,$mysqlpassword,$dbname,$tablename);

使い方
情報確認のみ「mysqltest.pl」
データ追加と情報確認「mysqltest.pl ins」

オプションとして「ins」(insert)を指定すると、データを追加する、というもの。

実行すると以下の様な形となる。

1# mysqltest.pl ins
2=== insert ===
3=== マスタサーバ ===
4name    text
5248     name284 Fri Jun 20 11:42:01 2014
6247     name563 Fri Jun 20 11:35:01 2014
7246     name934 Fri Jun 20 11:28:01 2014
8245     name769 Fri Jun 20 11:21:01 2014
9244     name227 Fri Jun 20 11:14:01 2014
10=== スレーブサーバ ===
11name    text
12248     name284 Fri Jun 20 11:42:01 2014
13247     name563 Fri Jun 20 11:35:01 2014
14246     name934 Fri Jun 20 11:28:01 2014
15245     name769 Fri Jun 20 11:21:01 2014
16244     name227 Fri Jun 20 11:14:01 2014
17#

「単純増加する数字 name+ランダム数字 日付」という出力内容のうち、最新の5件のみ表示する、というものになっている。

マスタサーバの出力内容と、スレーブサーバの出力内容を比べる、というもの。


2021/05/19

postgresql環境でのバックアップ試験のためにこのスクリプトを流用しようとしたところ、作り直しが必要なポイントがあった。

まずはテーブル作成時の違い

1create table testtable (
2    id int(20) not null auto_increment,
3    name char(100) default '' not null,
4    text char(255) default '',
5    primary key (id)
6);

これをそのまま実行すると下記エラーになる

1ERROR:  syntax error at or near "("
2LINE 2: id int(20) not null auto_increment,

int型auto_increment属性というのはMySQL特有で、postgresqlではserial型で置き換える。
「int(20) auto_increment」→「serial」に変更すると、以下のようになる。

1create table testtable (
2    id serial not null,
3    name char(100) default '' not null,
4    text char(255) default '',
5    primary key (id)
6);

また、perlモジュールは DBD:mysqlではなくDBD:Pgに変更になり、データベースとホスト指定手法が変わった。

パッケージとしては perl-DBD-Pg をインストールする。

1#!/usr/bin/perl
2 
3use DBI;
4 
5my $mysqluser="postgresql内のユーザ名";
6my $mysqlpassword="パスワード";
7my $masterserver="マスタサーバ名";
8my $slaveserver="スレーブサーバ名";
9my $dbname="test";
10my $tablename="testtable";
11$max=5;
12 
13sub getselect{
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");
17        $sth->execute;
18        print "\tname\ttext\n";
19        my $count=$max;
20        for(my $i=0; $i<$sth->rows; $i++){
21                my @tmp=$sth->fetchrow_array;
22                if($count>0){
23                        print $tmp[0] ."\t". $tmp[1] ."\t". $tmp[2] ."\n";
24                        $count--;
25                }
26        }
27        $sth->finish;
28        $db->disconnect;
29}
30 
31sub insertvalue{
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);
35        my $str2=localtime();
36        my $sth=$db->prepare("insert into $tablename (name, text) values ('name$str1','$str2')");
37        $sth->execute;
38        $sth->finish;
39        $db->disconnect;
40}
41 
42if($ARGV[0] =~ /ins/){
43        print "=== insert ===\n";
44        insertvalue($masterserver,$mysqluser,$mysqlpassword,$dbname,$tablename);
45}
46 
47print "=== postgresql:$masterserver ===\n";
48getselect($masterserver,$mysqluser,$mysqlpassword,$dbname,$tablename);
49 
50print "=== slave:$slaveserver ===\n";
51getselect($slaveserver,$mysqluser,$mysqlpassword,$dbname,$tablename);

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.

StatCounter - Free Web Tracker and Counter