Mysql master/slave配置过程
一般master用来写,表类型采用InnoDB,在并发很多的情况下,InnoDB的表现肯定要比MyISAM强很多;slave用来读,表类型采用MyISAM,一个master可以对应一个或多个slave,一般情况下来说读比写多吧,不过也要根据实际情况来定。
A服务器(WindowsXP): 192.168.1.54 主服务器master
B服务器(Linux): 192.168.1.23 副服务器slave
A服务器设置
#提示,此处最好用mysql的命令行执行命令,用SQLyog等工具时可能不行
mysql -u root -p
mysql>GRANT FILE ON *.* TO backup@192.168.1.23 IDENTIFIED BY '1234';
mysql>GRANT REPLICATION SLAVE ON *.* TO backup@192.168.1.23;
mysql>exit;
上面是Master开放一个账号backup密码1234给IP:192.168.1.23有档案处理的权限
停止mysql的服务,防止数据库中增加新的数据,确保复制到slave中的数据是一样的
(此时如果是用mysqldump导出数据的话,则不能停止mysql服务,停止web server就可以了,net stop apache服务名称)
停止mysql
mysqladmin -u root -p shutdown
或用net stop mysql服务名称(如mysql)
导出数据库结构及数据
D:\>mysqldump -u root -p ms_test > ms_test.sql
Enter password: ****
备份Master所有数据库结构及数据, MySQL是要在stop情况下
在A机器上修改my.ini
在[mysqld]区段内加入参数
log-bin=mysql-bin
server-id=1
#sql-bin-update-same
binlog-do-db=ms_test
重启A服务器mysql
B服务器设置
设定/etc/my.cnf
在[mysqld]区段加入
#added by alex in 08/21/1008
master-host=192.168.1.54
master-user=backup
master-password=1234
master-port=3306
server-id=2
master-connect-retry=60
replicate-do-db=ms_test
将A上备份的数据库结构及数据copy到B服务器上,然后将数据库结构及数据导入到B服务器中
因为导出的文件ms_test.sql中不含有创建数据库的sql语句,
一是方法是在B服务器上手动创建数据库
另一种方法是把create database if not exists `ms_test`;加到ms_test.sql的前面即可
这里我们采用在B服务器上手动创建数据库ms_test
mysql> create database if not exists `ms_test`;
Query OK, 1 row affected (0.00 sec)
导入数据库结构及数据
[root@www var]# mysql -u root -p ms_test < /root/ms_test.sql
Enter password:
重启B服务器的mysql
这时在/var/lib/mysql目录会出现master.info,此档案纪录了Master MySQL server的信息.
B服务器上的master.info
[root@www var]# more master.info
14
mysql-bin.000007
316
192.168.1.54
backup
1234
3306
60
0
B服务器上的www.sns.com.err
[root@www var]# cat www.sns.com.err
080822 15:00:01 mysqld started
080822 15:00:01 [Warning] The syntax for replication startup options is deprecated and will be removed in MySQL 5.2. Please use 'CHANGE MASTER' instead.
080822 15:00:01 InnoDB: Started; log sequence number 0 3105623
080822 15:00:01 [Warning] Neither --relay-log nor --relay-log-index were used; so replication may break when this MySQL server acts as a slave and has his hostname changed!! Please use '--relay-log=/usr/local/mysql/var/www-relay-bin' to avoid this problem.
080822 15:00:01 [Note] /usr/local/mysql/libexec/mysqld: ready for connections.
Version: '5.0.45-log' socket: '/tmp/mysql.sock' port: 3306 Source distribution
080822 15:00:01 [Note] Slave SQL thread initialized, starting replication in log 'mysql-bin.000007' at position 98, relay log '/usr/local/mysql/var/www-relay-bin.000016' position: 235
080822 15:00:01 [Note] Slave I/O thread: connected to master 'backup@192.168.1.54:3306', replication started in log 'mysql-bin.000007' at position 98
A服务器上mysql-bin.000007的内容为
--------------------------------------------------------------------------
状况测试
1.A跟B网络及服务都正常情况下,由A端变化数据后,到B端浏览数据,检视是否有进行replication?
2.模拟B当机,或是B不一定需要一直跟A有连接,将由A端变化数据后,到B端浏览数据,B点应该是没有数据变化的
我自己的测试:
在A服务器上添加数据前查看B服务器上的数据,有3条
mysql> select * from member;
+----+--------+------+
| id | name | age |
+----+--------+------+
| 1 | caihf | 20 |
| 2 | server | 11 |
| 3 | dd | 0 |
+----+--------+------+
3 rows in set (0.00 sec)
在A服务器上用工具SQLyog(其它的工具也可,用程序也可),加入一条数据
4 master/slave 127
然后再在B服务器上查看数据,发现有4条记录了,新添加的数据也在里面了,说明master/slave已经配置成功了!
mysql> mysql> select * from member;
+----+--------------+------+
| id | name | age |
+----+--------------+------+
| 1 | caihf | 20 |
| 2 | server | 11 |
| 3 | dd | 0 |
| 4 | master/slave | 127 |
+----+--------------+------+
4 rows in set (0.00 sec)