MySQL 支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其
它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索
引 以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接
主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。 从
服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你
必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的
更新之间的冲突。
单向复制有利于健壮性、速度和系统管理:
· 主服务器/从服务器设置增加了健壮性。主服务器出现问题时,你可以切换到
从服务器作为份。
· 通 过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的
客户响应时间。SELECT查询可以发送到从服务器以降低主服务器的查询处理负
荷。但 修改数据的语句仍然应发送到主服务器,以便主服务器和从服务器保持同
步。如果非更新查询为主,该负载均衡策略很有效,但一般是更新查询。
· 使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务
器。在备份过程中主服务器可以继续处理更新。
MySQL 提供了数据库的同步功能,这对我们实现数据库的冗灾、备份、恢复、负载均
衡等都是有极大帮助
rhel6 master:192.168.0.64 slave:192.168.0.97
mysql 的单向复制
注: mysql 数据库的版本,两个数据库版本要相同,或者 slave 比 master 版本高!
在 master slave 上安装mysql 软件
yum install mysql mysql-server -y
master server配置
1)创建同步帐户,并给予权限
mysql> GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO smart@'192.168.0.97' IDENTIFIED BY 'westos';
mysql>Flush privileges;
2 )配置 /etc/my.cnf 配置文件
在[mysqld]下添加一下参数
log-bin=mysql-bin #启动二进制日志系统
binlog-do-db=test #二进制需要同步的数据库名
binlog-do-db=westos #必须为1到232–1之间的一个正整数值。如果想同步多个数据库,则需在下一行再写。
server-id=1 #主 server-id 要比 从 server-id 小
binlog-ignore-db=mysql #避免同步 mysql 用户配置,以免不必要的麻烦
3 )service mysqld restart
slave server 配置
1 )配置 /etc/ my.cnf 文件
在[mysqld]下添加一下参数
server-id=2 #从服务器 ID 号,不要和主 ID 相同,如果设置多个从服务器,每个从服务器必须有一个唯一的server-id值,必须与主服务器的以及其它从服务器的不相同。可以认为server-id值类似于IP地址:这些ID值能唯一识别复制服务器群集中的每个服务器实例。
2)service mysqld restart
检测
在master上用下面的命令查看
mysql> show master status;
+---------------------+-----------+----------------+--------------------+
| File
| Position
| Binlog_Do_DB | Binlog_Ignore_DB
|
+---------------------+-----------+----------------+--------------------+
| mysql-bin.000001
|
98
| test
| mysql
|
+---------------------+-----------+----------------+--------------------+
记录File和Position的值,下面会用到。
在slave上执行以下命令:
mysql> slave stop;
Query OK, 0 rows affected (0.00 sec)
mysql> change master to master_host='192.168.0.64', master_user='smart',
master_password='westos', master_log_file='mysql-bin.000001',
master_log_pos=98;
Query OK, 0 rows affected (0.28 sec)
mysql> slave start;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G; #在显示的信息中查看以下两行是否都是yes。如果IO 为no,则表明slave 连接 master 有问题,需检查连接的用户名和密码。如果SQL 为no,则表明你的SQL语句有问题。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果都是yes,表示从库的I/O,Slave_SQL线程都正确开启.表明数据库正在同步。你也可以通过在master server上的test库中添加数据,看slave server是否同步,建议使用phpmyadmin,比较方便。
注:当做双向同步时,需确保数据的一致性,先在mysql的配置文件添加同步的库,重启mysql,然后在两主机分别 show slave stutas\G; 查看 IO 和SQL 是否都是yes,然后在任意一台主机新建数据库,则另一台就会同步过来。
mysql 双向复制
slave server配置
1 )修改 /etc/my.cnf 文件
log-bin=mysql-bin #启动二进制日志系统
binlog-do-db=test设 #置同步数据库名
binlog-ignore-db=mysql #避免同步mysql用户配置,以免不必要的麻烦
2)重新启动 mysql 服务,创建一个同步专用账号
service mysqld restart
mysql> GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO smart@'192.168.0.64'
IDENTIFIED BY 'westos';
mysql>Flush privileges;
master server配置:
mysql -uroot -pwestos
change master to master_host='192.168.0.97',master_user='smart',master_password='westos',master_log_file='mysql-bin.000012',master_log_pos=106;
Mysql主从不同步解决:
1、由于binlog日志带多删除了几个后发发现不同步
mysql> show slave status\G;
Slave_IO_Running: No
Slave_SQL_Running: Yes
查看报错日志为
[ERROR] Slave I/O: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file',
解决方式
从服务器配置:
主服务器查看
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 | 106 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
从服务器设置
mysql> change master to master_host='192.168.0.10',master_user='replication',master_password='replication',master_log_file='mysql-bin.000003',master_log_pos=106;
Query OK, 0 rows affected (0.03 sec)
mysql>stop slave;
mysql>start slave;
主服务器配置
从服务器上查看
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 | 106 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
主服务器配置
mysql> change master to master_host='192.168.0.11',master_user='replication',master_password='replication',master_log_file='mysql-bin.000005',master_log_pos=106;
Query OK, 0 rows affected (0.03 sec)
mysql>stop slave;
mysql>start slave;
在查看slave状态ok解决。