数据库主从复制原理:
数据库的主从复制就是从master数据库复制到slave数据库,在master与slave之间实现整个复制需要三个线程来完成,其中两个在slave端一个在master端。
在master端必须打开binlog功能,因为从数据库需要获得主数据的完整的操作日志然后再自身上顺序的执行日志中的各种操作。
主要步骤:
1、将slave的io线程连上master,请求获得指定日志文件的指定位置之后的操作日志的内容;
2、master获得slave的io线程请求后,将请求中读取到的指定日志的指定位置之后的内容返回给slave端的io线程,其中包括binlog 的位置以及名称;
3、slave端的io线程在接收到信息后,将接收到的日志内容写入slave端的relay log文件的末端,并将binlog的文件名和位置记录到master-info文件中,以便下一次请求时向master提出请求;
4、slave的sql线程会检测到relay log中新增的一些日志内容并加以解析成为可执行的query语句在slave端执行,从而达到master与slave端的数据一致性。
配置方法:
1、编辑master的配置文件/etc/my.cnf,在[mysqld]中添加以下内容:
log-bin=mysql-bin #打开mysql的操作日志功能
binlog_format=mixed #主从复制模式,混合模式(MBR)默认的
binlog_cache_size=4M #设置binlog缓存大小
max_binlog_size=300M #设置binlog文件大小,如果不设置,默认是1.1GB
expire_logs_days= 3 #bin-log在主库保存的天数,主库产生的bin-log并不会自动删除,需要手动删除
server-id=99 #用于标识server,一个集群里的mysql节点,server-id必须是唯一的
2、在master上对从数据库进行授权,建立复制用户的专有账户
mysql>GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’%’ IDENTIFIED BY ‘repl';
3、对master的数据库进行备份
在备份master数据时要对master执行锁表操作:
mysql>FLUSH TABLES WITH READ LOCK; #锁表,此时master只能用于read
Query OK, 0 rows affected (0.00 sec)
mysql> reset master; #刷新数据库
Query OK, 0 rows affected (0.00 sec)
在不退出该终端的情况下(否则锁表会失效),再次开启一个终端直接打包压缩数据文件或者使用mysqldump工具来导出数据:
#mysqldump -uroot -h 127.0.0.1 –opt -R XXXXXX > /data/mysql/backup/XXXXXX.sql
#cd/data/mysql/backup/
4、备份数据库到从数据库
shell> tar -czvf XXXXXX.tar.gz XXXXXX.sql
shell> scp XXXXXX.tar.gz root@10.7.70.42:/data/mysql/backup
shell> tar zxvf XXXXXX.tar.gz
mysql>create database XXX;
mysql>use XXX;
mysql>set names utf8;
mysql>source /XXXXXX/XXX.sql
可用相同的方法将数据库导入到其他的slave机器上
5、解锁主库
导入完成后在Master的命令终端上执行一下解锁命令:
mysql>UNLOCK TABLES;
mysql>show processlist;
mysql>show master status\G; #查看主服务器的bin-log 和id
6、设置slave主机
编辑slave从数据库的/etc/my.cnf配置文件,前面的配置参数与主的一样,都是根据硬件内存进行参数调整:
#binlog_format=mixed
#required unique id between 1 and 2^32 – 1
#defaults to 1 if master-host is not set
#but will not function as a master if omitted
server-id=2 #slave 的编号 注意不要重复
read_only=1
expire_logs_days = 3
log_slave_updates #从服务器从主服务器接收到的更新不记入它的二进制日志
binlog_format=mixed
binlog_cache_size=4M #设置binlog缓存大小
max_binlog_size=300M #设置binlog文件最大体积
设置从数据库的主master:
mysql>CHANGE MASTER TO MASTER_HOST=’XX.XX.XX.XX’, #主数据库的ip地址
->MASTER_USER=’repl’, #同步用户
->MASTER_PASSWORD=’repl’, #同步用户密码
->MASTER_LOG_FILE=’mysql-bin.000001′, #这里根据主服务器的binlog和id设置
->MASTER_LOG_POS=107; #同步开始主服务器的binlog的位置
设置完成后,开启slave服务:
7、开启slave
mysql> slave start;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G; #显示slave的状态
从输出结果中若:Slave_IO_Running和Slave_SQL_Running如果都为Yes时,表示配置成功
在线添加多个从库:
原理:若直接在主数据库上再次添加从库会执行停止mysql 的服务进行锁表操作从而影响正常的工作流程,
故在线添加从数据库可以通过备份旧的从数据库达到数据库复制的目的。再次利用change master 可达到在线添加从数据库的目的。