我自己配置Mysql Master/Slave的过程

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)

from:http://blog.csdn.net/rogerzhanglijie/article/details/16819067