查看文章 |
(一) 资料: slave同步失败主要问题: 二进制日志只是从启用二进制日志开始的时刻才记录更新操作的,所有的slave必须在启用二进制日志时把master上已经存在的数据拷贝过来。如果运行同步时slave上的数据和master上启用二进制日志时的数据不一致的话,那么slave同步就会失败。 数据库初始同步方式: 把master上的数据拷贝过来的方法之一实在slave上执行LOAD DATA FROM MASTER语句。不过要注意,LOAD DATA FROM MASTER是从MySQL4.0.0之后才开始可以用的,而且只支持master上的MyISAM类型表 暂停主服务器,导入数据文件,在从服务器上导入。
MySQL同步细节 MySQL同步功能由3个线程(master上1个,slave上2个)来实现。执行START SLAVE语句后,slave就创建一个I/O线程。I/O线程连接到master上,并请求master发送二进制日志中的语句。master创建一个线程来把日志的内容发送到slave上。这个线程在master上执行SHOW PROCESSLIST语句后的结果中的Binlog Dump线程便是。slave上的I/O线程读取master的Binlog Dump线程发送的语句,并且把它们拷贝到其数据目录下的中继日志(relay logs)中。第三个是SQL线程,salve用它来读取中继日志,然后执行它们来更新数据。如上所述,每个mster/slave上都有3个线程。每个master上有多个线程,它为每个slave连接都创建一个线程,每个slave只有I/O和SQL线程。在MySQL4.0.2以前,同步只需2个线程(master和slave各一个)。slave上的I/O和SQL线程合并成一个了,它不使用中继日志。slave上使用2个线程的优点是,把读日志和执行分开成2个独立的任务。执行任务如果慢的话,读日志任务不会跟着慢下来。例如,如果slave停止了一段时间,那么I/O线程可以在slave启动后很快地从master上读取全部日志,尽管SQL线程可能落后I/O线程好几的小时。如果slave在SQL线程没全部执行完就停止了,但I/O线程却已经把所有的更新日志都读取并且保存在本地的中继日志中了,因此在slave再次启动后就会继续执行它们了。这就允许在master上清除二进制日志,因为slave已经无需去master读取更新日志了。执行SHOW PROCESSLIST语句就会告诉我们所关心的master和slave上发生的情况。
(二) 配置过程: 2. 编辑配置文件my.cnf 3. 启动MYSQL并进入MYSQL进行命令配置操作,主要工作是使得主从能同步(在双机热互备中只是将两者互成主从机,只要一方改变数据就会同步另一方。)
(三) 主从复制配置: 2. 配置mysql配置文件: 1) 主服务器: a) 编辑主服务器的配置文件:/etc/my.cnf server-id = 1 log-bin binlog-do-db=需要备份的数据库名,如果备份多个数据库,重复设置这个选项即可 binlog-ignore-db=不需要备份的数据库苦命,如果备份多个数据库,重复设置这个选项即可。
2) 从服务器: a) 编辑从服务器的配置文件:/etc/my.cnf(或者通过scp从主服务器复制过来修改) server-id=2(配置多个从服务器时依次设置id号) master-host=主机 master-user=用户名 master-password=密码 master-port=端口 replicate-do-db=需要备份的数据库名,如果备份多个数据库,重复设置这个选项即可 3. 启动MYSQL并进行配置 1) 在主服务器上为从服务器建立一个用户(建立复制帐号权限):grant replication slave on *.* to‘用户名‘@’主机’identified by‘密码’;(在MySQL 4 dot 0.2以前,用FILE权限来代替REPLICATION SLAVE) *如果打算在slave上执行LOAD TABLE FROM MASTER或LOAD DATA FROM MASTER语句,那么必须给该帐户授予附加权限:授予全局SUPER和RELOAD权限。授予对想要加载的所有表上的SELECT权限。在master上任何没有SELECT权限的表都会被LOAD DATA FROM MASTER略过。 2) 将数据从主服务器中导出并导入从服务器 Mysql> flush tables with read lock; #锁定主服务器上的表为只读状态 Mysql>show master status; #查看主节点的状态 [root@server02]# mysqldump -uroot -p --skip-opt --single-transaction --add-drop-table --create-options --quick --extended-insert --set-charset --disable-keys CPMS > cpms.sql #创建一个完整的备份
3) [root@server02]# scp cpms.sqlroot@172.20.86.27:/tmp#把数据传输到从节点上 [root@server02]# mysql CPMS < /tmp/cpms.sql #把数据导入到从节点 Mysql>change master to master_host = '主服务器IP', master_user = '刚才建立用来复制的用户名', master_password = '复制用户名的密码', master_log_file = 'mysql-bin.000004', master_log_pos =98; #设置从节点连接主节点(master_log_file和master_log_pos这个需要在主服务器中通过show master status;查看得来) Mysql>slave start; #启动复制 4) show slave status\G查看复制状态
mysql有部分特别配置,主要是运行性能等: 主配置文件增加: [client] default-character-set=utf8 [mysqld] default-character-set=utf8 skip-name-resolve back_log = 500 max_connections = 1000 max_connect_errors = 100 binlog-do-db=CPMS 从配置文件增加: [client] default-character-set=utf8 [mysqld] default-character-set=utf8 skip-name-resolve back_log = 500 max_connections = 1000 max_connect_errors = 100 slave_skip_error=1062 server-id = 2 sync_binlog=1 binlog-do-db=CPMS replicate-do-db=CPMS
(四) Mysql的实时同步-双机互备 设置方法: 步一 设 A服务服(10.6.6.21)上用户为copy, copy,同步的数据库为CPMS; B服务服(10.6.6.22)上用户为copy, copy,同步的数据库为CPMS;
步二 配置mysql.cnf: A服务器
#replication master server-id = 21 log-bin binlog-do-db=CPMS binlog-do-db=
#replication slave master-host=10.6.6.22 master-user=copy master-password=copy master-port=3306 replicate-do-db=CPMS B服务器
#replication master server-id=20 binlog-do-db=CPMS
#replication slave master-host=10.6.6.21 master-user=copy master-password=copy master-port=3306 replicate-do-db=CPMS ============================================================= 解释:
3)binlog-do-db=test表示需要备份的数据库是CPMS这个数据库, 如果需要备份多个数据库,那么应该写多行,如下所示: binlog-do-db=backup1 binlog-do-db=backup2 binlog-do-db=backup3
解释: 1) server-id=2表示本机器的序号, A,B的server-id不能相同; 2)log-bin表示打开binlog,打开该选项才可以通过I/O写到Slave的relay-log,也是可以进行replication的前提; 其中mysql_binary_log是日志文件的名称,mysql将建立不同扩展名,文件名为mysql_binary_log的几个日志文件. 3) master-host="192.168.1.23"表示A做slave时的master为192.168.1.23; 4) master-user=root这里表示master上开放的一个有权限的用户,使其可以从slave连接到master并进行复制; 5) master-password=123456表示授权用户的密码; 6) master-port=3306 master上MySQL服务Listen3306端口; 7) master-connect-retry=60同步间隔时间; 8) replicate-do-db=test表示同步backup数据库;
最后重新启动两台机器的mysql. ------------------------------------------------ 查看状态 及调试
1,查看master的状态 SHOW MASTER STATUS; Position不应为0 2,查看slave的状态 show slave status; Slave_IO_Running | Slave_SQL_Running这两个字段 应为YES|YES. show processlist; 会有两条记录与同步有关state为Has read all relay log; waiting for the slave I/O thread to update it 和s Waiting for master to send event . 3,错误日志 MySQL安装目录\data\Hostname.err
4,CHANGE MASTER TO 如果A的Slave未启动,Slave_IO_Running为No. 可能会是B的master的信息有变化, 查看B SHOW MASTER STATUS; 记录下File,Position字段.假设为'mysql_binary_log.000004',98 ; 在A下执行: Stop Slave; CHANGE MASTER TO MASTER_LOG_FILE = 'mysql_binary_log.000004', MASTER_LOG_POS = 98 ;
Start Slave;
5,SET GLOBAL SQL_SLAVE_SKIP_COUNTER = n; 如果A的Slave_SQL_Running为No. Err文件中记录: Slave: Error 'Duplicate entry '1' for key 1' on query.... 可能是master未向slave同步成功,但slave中已经有了记录。造成的冲突. 可以在A上执行 SET GLOBAL SQL_SLAVE_SKIP_COUNTER = n; 跳过几步。再 restart salve;
|

