MySQL主从复制的配置
一、原理
将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的。复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
注意:更新数据时只能在主服务器上操作,否则会导致主从服务器的数据不一致
二、主服务器的配置
配置主配置文件
#vim /etc/my.cnf
[server]
port = 3306
socket = /tmp/mysql.sock
[mysqld]
user = mysql
innodb_buffer_pool_size = 128M
log_bin = master-log \\注意开启二进制日志功能
max_binlog_size = 64M
binlog_format = mixed \\row(行)、statement(语句,在日志中可看到操作的语句)
basedir = /usr/local/mysql
datadir = /database/mydata
port = 3306
server_id = 1 \\slave主机上的id应为2
socket = /tmp/mysql.sock
log_error = /database/mydata/server1.err
character_set_server = utf8
explicit_defaults_for_timestamp = on
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
数据库初始化
#./scripts/mysql_install_db --user=mysql --datadir=/database/mydata
给从服务器授权
mysql> grant replication slave on *.* to 'repuser'@'10.0.10.1' identified by '123123';
mysql> flush privileges;
mysql> show master status\G
三、从服务器的配置
配置主配置文件
#vim /etc/my.cnf
[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld]
user = mysql
innodb_buffer_pool_size = 128M
log_bin = slave-log
max_binlog_size = 64M
log_slave_updates = on \\开启更新
binlog_format = mixed
relay_log = relay-bin \\中继日志
basedir = /usr/local/mysql
datadir = /database/mydata
port = 3306
server_id = 2
socket = /tmp/mysql.sock
log_error = /database/mydata/server1.err
character_set_server = utf8
explicit_defaults_for_timestamp = on
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
数据库初始化
# ./scripts/mysql_install_db --user=mysql --datadir=/database/mydata
设置从服务器相关信息
mysql> change master to master_host='10.0.10.1',master_user='repuser',master_password='123123',master_log_file='master-log.000003',master_log_pos=409,master_port=3306;
mysql> start slave;
mysql> show slave status\G
mysql> stop slave;
四、对二进制日志的相关操作
# mysqlbinlog master-log.000001 \\查看此日志的内容
# mysqlbinlog --start-datetime='2015-07-13 7:10:0' master-log.000003
# mysqlbinlog --start-datetime='2015-07-13 7:10:0' --stop-datetime='2015-07-13 7:33:0' master-log.000003
# mysqlbinlog --start-position=330 master-log.000003
# mysqlbinlog --start-position=330 --stop-position=1100 master-log.000003
# mysqlbinlog --start-position=330 --stop-position=1100 master-log.000003 | mysql -u root \\恢复指定二进制日志的内容
mysql> show master logs; mysql> show binary logs; \\查看日志
mysql> show binlog events in 'master-log.000003' limit 20;
mysql> show binlog events in 'master-log.000003' from 409 limit 10;
mysql> purge master logs to 'master-log.000002'; \\删除指定编号之前的日志
mysql> purge master logs before '2015-07-22 08:00:00';
mysql> flush logs; \\刷新日志
五、其他
设置忽略的数据库---只复制某些特定的数据
1.主服务器设置
binlog_do_db = zz \\记录二进制日志的数据库
binlog_ignore_db = test \\不记录二进制日志的数据库
binlog_ignore_db = teach
2.从服务器设置
replicate_do_db = zz \\设置默认进行二进制日志复制的数据库
replicate_ignore_db = test \\不进行二进制日志复制的数据库
replicate_ignore_db = teach
replicate_ignore_db = mysql
replicate_ignore_db = information_schema
replicate_do_table = zz.stu \\设置进行更新的表
replicate_ignore_table = zz.class \\不进行更新的表
3.从服务器建议设置
replicate_ignore_db = test \\不进行二进制日志复制的数据库
replicate_ignore_db = mysql
replicate_ignore_db = information_schema
replicate_wild_do_table = zz.stu \\复制指定的数据库或表的二进制日志
replicate_wild_do_table = zz.%
replicate_wild_ignore_table = zz.class \\不复制指定的数据库或表的二进制日志
另:双主复制---更新操作可以在任意一条主机上进行
第一台服务器设置
auto_increment_increment = 2 \\数据表记录的自增量,一般等于服务器的数量
auto_increment_offset = 1 \\数据表记录每次的递增量,第一台为1,第二台为2,...
sync_binlog = 0 \\二进制日志写入磁盘的方式( 同步1 or 不同步0 )
replicate_same_server_id = 0 \\防止mysql循环更新
mysql> grant replication slave on *.* to 'repuser'@'10.0.10.1' identified by '123123';
mysql> flush privileges;
第二台服务器设置
mysql> change master to master_host='10.0.10.1',master_user='repuser',master_password='123123',master_auto_position=1;
mysql> start slave;