Mysql中复制介绍及主从服务器的配置

复制介绍

MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主 服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。

如果你想要设置链式复制服务器,从服务器本身也可以充当主服务器。

请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。

单向复制有利于健壮性、速度和系统管理:

· 主服务器/从服务器设置增加了健壮性。主服务器出现问题时,你可以切换到从服务器作为备份。

· 通过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的客户响应时间。SELECT查询可以发送到从服务器以降低主服务器的查询处理负荷。但修改数据的语句仍然应发送到主服务器,以便主服务器和从服务器保持同步。如果非更新查询为主,该负载均衡策略很有效,但一般是更新查询。

· 使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务器。在备份过程中主服务器可以继续处理更新。

主从服务器的配置

假如有两台机器,
A: 192.168.10.86
B: 192.168.10.87

想把A配置成主服务器,B配置成从服务器(从服务器可以有多个,这里做一个为例子,其它的从机操作基本相同),操作步骤如下:
机器A上的操作:
1.为从服务器创建复制帐号(建议只用这个用户做复制帐号使用,不要做为它用)
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.10.87' IDENTIFIED BY 'slavepass';

2.修改/etc/my.cnf

在[mysqld]中添加如下内容:
server-id = 1 #主机标示,唯一整数,不能和其它主从服务器相同。
log_bin = /var/log/mysql/mysql-bin #确保此文件mysql可写
binlog-do-db =test #需要备份数据,多个写多行
binlog-ignore-db=mysql #不需要备份的数据库,多个写多行

$ sudo service mysqld restart

机器B上的操作:1. 先测试一下,复制帐号是否可用:
$ mysql -h192.168.10.86 -urepl -pslavepass

2. 修改/etc/my.cnf
在[mysqld]中添加如下内容:

server-id=2
master-host=192.168.10.86
master-port=3306
master-user=repl
master-password=test
master-connect-retry=5

replicate-do-db =test

参数介绍:

master-host=host

主复制服务器的主机名或IP地址。如果没有给出该选项,从服务器线程不启动。

master-password=password

连接主服务器时从服务器线程用于鉴定的账户的密码。如果未设置,假定密码为空。

master-port=port_number

mysql的的端口号(如果你没有修改的话就是3306)

master-user=username

连接主服务器时从服务器线程用于鉴定的账户的用户名。该账户必须具有REPLICATION SLAVE权限。如果未设置主服务器用户,假定使用用户test。

replicate-do-db=db_name

告诉从服务器限制默认数据库(由USE所选择)为db_name的语句的复制。要指定多个数据库,应多次使用该选项,每个数据库使用一次。请注意不复制跨数据库的语句,例如当已经选择了其它数据库或没有数据库时执行UPDATEsome_db.some_table SET foo='bar'。如果需要跨数据库进行更新,使用--replicate-wild-do-table=db_name.%。请读取该选项列表后面的注意事项。

一个不能按照期望工作的例子:如果用--replicate-do-db=sales启动从服务器,并且在主服务器上执行下面的语句,UPDATE语句不会复制:

USE prices; UPDATE sales.january SET amount=amount+1000; 如果需要跨数据库进行更新,应使用--replicate-wild-do-table=db_name.%。

master-connect-retry=retry_seconds
从服务器丢失与主服务器的连接,从服务器尝试立即重新连接。如果失败,则过retry_seconds秒后重新连接。

数据库同步

修改完后,要进行数据同步。
同步方法可以用两种方法
1.
mysql> LOAD DATA FROM MASTER;

使用这种方法时,授予复制帐户必须有SUPER和RELOAD全局权限(前面我们创建的帐号没有这个权限)。
LOAD DATA FROM MASTER目前只在所有表使用MyISAM存储引擎的主服务器上工作。并且,该语句将获得全局读锁定,因此当表正复制到从服务器上时,不可能在主服务器上进行更新。

2.
用mysqldump将主服务器中要复制的数据库导出,在本例中我们用test
$ mysqldump -uroot -p test --databases > test.sql

然后将其拷贝到B机器中,导入数据。
$ mysql -uroot -p < test.sql

验证

在主机A中,mysql>show master status;

在从机B中,mysql>show slave status;

然后,在主机中插入一条数据,看一下B机上的数据库中有相应的数据。

注意:你不能从使用新二进制日志格式的主服务器向使用旧二进制日志格式的从服务器复制(例如,从MySQL 5.0到MySQL 4.1)。这样操作在复制设置升级服务器时后果严重

合理利用mysql的主从数据库,可以为大负载的需求提供负载均衡,并且可以实现读写分离,可以做更多的优化。