数据库读法约定:
主库: master
从库: slave
mysql 主从同步的原理:
#主从是异步模式,且是由从库找主库进行同步;
1、主库开启IO线程; 开启binlog;
#binlog记录用户的增删改
从库开启IO线程; 开启SQL线程;
2、主库授权从库同步的帐号密码;
3、备份主库数据且导入从库;
4、在从库change master to 导入用于同步主库的ip、port、user、等信息。
CHANGE MASTER TO
MASTER_HOST='10.0.0.%',
MASTER_PORT=3306,
MASTER_USER='rep',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000018',
MASTER_LOG_POS=330;
5、start slave 开启从库;
6、从库的IO线程向主库的IO线程发起请求;
主库的IO线程验证请求从库的账户、密码等信息是否合法;
主库返回从库请求的数据(file 、pos);
7、从库IO接受到主库的log日志后,将log写入中继日志relay-log;
从库SQL线程读取relay.log转换后写入从库;
#如果是级联,从库需记录logbin
从库master.info记录从库跟新的位置点;
8、从库IO线程继续向主库请求上一次位置点往下的binlog数据.....
mysql主从同步的步骤:
1)、准备两台数据库环境,或者单台多实例环境,可以正常启动和登录。
2)、配置my.cnf文件。主库配置log-bin和server-id 参数,从库配置server-id,id不可以和主库及其它从库一样,从库一般不开启log-bin功能,注意重启生效,(从库在备份、级联时开启binlog);
vi /etc/my.cnf
49 log-bin=mysql-bin
46 server-id = 1
#以上两个参数要放在my.cnf中的[mysqld]模块下,否则会出错;
查看:egrep -E "server-id|log-bin" /etc/my.cnf
server-id = 1
log-bin=mysql-bin
生效查看:
А、ll ../mysql/data/下是否有mysql-bin.000005日志生成;
Β、mysql -uroot-p123456 -e "show variables like 'log_bin';"
观察:| log_bin | ON | 是否为ON
#如果从库是中继需开启binlog、开启log_slave_updates则可以写入。
3)、登录主库增加用于从库连接主库同步的帐号,例如:rep授权replicattion slave的权限;
grant resplication slave on *.* to"rep"@"10.0.0.%" identified by "123456";
刷新权限:
flush privileges;
##replication slave为mysql同步的必须权限,此处不要授权all;
##*.*表示所有库所有表,可以指定具体的库和表进行复制
##"rep"@"10.0.0.%" rep为同步帐号。10.0.0.%为授权的网段,使用%表示整个10.0.0.0网段以rep用户访问;
4)、主库登录,整库锁表;然后查看binlog的位置状态;
flush table with read lock;
#窗口关闭后及失效,超时参数到了也失效)
mysql> show masterstatus;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB |Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000022 | 107 | | |
+------------------+----------+--------------+------------------+
注意:flush tables with read lock 5.1
Flush table with readlock 5.5
mysql-bin.000022=file 107=pos
5)、新开窗口,linux命令行备份或导出原有数据库的数据,并拷贝到从库所在的服务目录;
mysqldump -uroot -p123456 -B -A--master-data=1 --events --single-transaction >/back/my.back
#备份,如果数据量很大,允许停机,可以停机打包,而不用mysqldump;
6)、解锁主库,unlock tables;
或者--master-data=1
7)、把主库导出的原有数据恢复到从库。
8)、根据主库的show master status;查看binlog的位置状态,在从库执行changemaster to 语句;
CHANGE MASTER TO
MASTER_HOST='10.0.0.8',
#主库的ip地址;
MASTER_PORT=3306,
#主库mysql的端口;
MASTER_USER='rep',
#主库允许从库备份的帐号
MASTER_PASSWORD='123456',
#允许帐号的密码,
MASTER_LOG_FILE='mysql-bin.000018',
#mysql-bin的位置;
MASTER_LOG_POS=330;
CHANGE MASTER TO
MASTER_HOST='10.0.0.%',
MASTER_PORT=3306,
MASTER_USER='rep',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000018',
MASTER_LOG_POS=330;
9)、从库开启同步开关:
start slave;
10)、从库检查同步状态,并在主库进行跟新操作;
Show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
为正常
线程的启动与关闭:
停止MYSQL同步
STOP SLAVE IO_THREAD; #停止IO进程
STOP SLAVE SQL_THREAD; #停止SQL进程
STOP SLAVE; #停止IO和SQL进程
启动MYSQL同步
START SLAVE IO_THREAD; #启动IO进程
START SLAVE SQL_THREAD; #启动SQL进程
START SLAVE; #启动IO和SQL进程
RESET SLAVE; #重置MYSQL同步
# 用于让从服务器忘记其在主服务器的二进制日志中的复制位置, 它会删除master.info和relay-log.info文件,以及所有的中继日志,并启动一个新的中继日志,当你不需要主从的时候可以在从上执行 这个操作。不然以后还会同步,可能会覆盖掉你的数据库,我以前就遇到过这样傻叉的事情。哈哈!