| Blog信息 |
|
blog名称: 日志总数:1304 评论数量:2242 留言数量:5 访问次数:7650360 建立时间:2006年5月29日 |

| |
|
[MySQL]MySQL同步 软件技术
lhwork 发表于 2006/12/27 15:10:39 |
| MySQL 提供了数据库的同步备份功能,这对我们实现数据库的冗灾、备份/ 恢复、负载均衡等都是有极大帮助的。一、准备工作1、MySQL 版本 设置MySQL同步时,最好的版本组合就是master(以下简称 M)和slave(以下简称 S)的版本一样,或者S的版本比M的版本新,但是一定不能是S的版本比M的版本旧,因为旧版本的binlog格式和新版本的不一样,而新版本能兼容旧的格式,反之却不能。2、二、配置同步客户端同步数据库的硬件环境最好能够与主数据库完全一致,软件环境完全与主数据库相同的配置。现在我们需要在 my.cnf 文件里面做些修改,使这台数据库成为同步数据库:首先我们找到 server-id ,这个 id 是每一台数据库的唯一编号,在一个数据库同步系统里面编号不允许重复,我们现在把这个编号设置成 2。然后我们在下面增加几行:#rm -f /path_to_mysql/mysql/var/master.infomaster-host = 主数据库的 i pmaster-user = 数据同步专用账户名master-password = 密码master-port = 主数据库的 TCP/IP 端口号set-variable=replicate-do-db = db_wantto_doset-variable=replicate-ignore-db = mysql#set-variable=replicate-rewrite-db = "rewrite->abccba"log-bin选项可加可不加,建议加上,以备将来出现问题时,能根据binary log来修复系统。为了保护 SLAVE 端的 MySQL系统库,我们需要增加:另一个方法是:#skip-slave-start(mysql> CHANGE MASTER TO MASTER_HOST='master_host_name', MASTER_USER='replication_user_name', MASTER_PASSWORD='replication_password', MASTER_LOG_FILE='recorded_log_file_name', MASTER_LOG_POS=recorded_log_position;)第三节 配置服务端首先修改 my.cnf,加入以下几行:server-id = 1;#binary-do-db = db_wantto_do使用 MySQL工具连接到数据库:$mysql -uroot -pxxxmysql>grant file,select on *.* to rep@host identified by 'passwd'; /*mysql 4.0以前*/ormysql>grant replication slave on *.* to rep@host identified by 'passwd'; /*mysql 4.0以后*/or(全部)mysql>grant all privileges on *.* to rep@host identified by 'passwd';mysql>flush privileges;建立一个用户 'rep',限制它只能在主机 'host' 上登录,并且需要使用密码。这样我们就给予了同步数据库从主数据库获取同步数据的权限。再回到同步客户机,做一下试验:$mysql -uroot -pxxmysql>show slave status\G*************************** 1. row *************************** Slave_IO_State: Connecting to master Master_Host: 192.168.0.1 Master_User: rep Master_Port: 3306 Connect_Retry: 3 Master_Log_File: test-bin.000001 Read_Master_Log_Pos: 391 Relay_Log_File: yejr-relay-bin.000003 Relay_Log_Pos: 98 Relay_Master_Log_File: test-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table:Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 391 Relay_Log_Space: 98 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: NULL我们看到 Slave_SQL_Running和Slave_IO_Running 这一列的值是 Yes,说明数据库的同步已经在运行了。多次执行 show slave status 指令,可以看到 pos 相关的列的值不断的增加。或者也可以通过 show processlist; 来查看slave端的系统状况:Mysql>show processlist;+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------+------------------+| Id | User | Host | db | Command | Time | State | Info |+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------+------------------+| 4 | system user | | NULL | Connect | 398 | Waiting for master to send event | NULL || 5 | system user | | NULL | Connect | 398 | Has read all relay log; waiting for the I/O slave thread to update it | NULL |+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------+------------------+上面是正常的情况,出现错误时的情况大致如下:mysql>; show processlist;+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------+------------------+| Id | User | Host | db | Command | Time | State | Info |+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------+------------------+| 4 | system user | | NULL | Connect | 454 | Reconnecting after a failed master event read | NULL || 5 | system user | | NULL | Connect | 454 | Has read all relay log; waiting for the I/O slave thread to update it | NULL |+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------+------------------+这里的Reconnecting只是错误的一种,有可能是connecting,则表示正在连接,那么请检查:1 master上的mysql daemon是否正常运行2 master与slave的网络连接是否正常3 my.cnf是否配置正确4 在修改配置后是否删除过master.info?(删掉以后会自动再生成一个,别担心删掉),因为如果不删掉的话,那么则还是使用原来的配置5 修改配置后有没有重新启动mysql daemon,重新启动过程后必须证实mysql已经正常启动6 master上给slave及slave给master上分配的replication用户权限是否正确,master的主机名和dns设置7 当前状况两台数据库是否完全相同.第四节 如果同步出现了问题,我该如何处理?如 果 我 们 执 行 show slave status 的 时 候 发 现 Slave_IO_Running/Slave_SQL_Running的 列 值 为 No , 这 个 时 候 就 说明 MySQL 的数据同步系统 出现了问题 ,参考后面 两列(La s t _ e r r n o ,Last_er r o r )的信息得知详细的问题报告。一般的 Last_Error 列会给出出错的 SQL 语句,同时给出错误的原因。一般的我们只需要执行:mysql>stop slave;mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER=N;mysql>start slave;如果下一个从master读取执行的语句没有使用 AUTO_INCREMENT 或者 LAST_INSERT_ID(),则 N 的值最好是 1,其他的可以是2。当然了,也可以自己写一个脚本来定时监控slave的状态:#!/bin/shwhile [ 1 ]do while [ `echo "show slave status"|mysql -uroot -pxx|tail -n 1|awk '{print $14}'`='No' ] do echo "stop slave;SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; start slave;"|mysql -uroot -pxx > /dev/null 2>&1 done sleep 60done第五节 与日志文件相关的命令1.flush log 指令强制 binary log 翻滚。有时候我们需要强制系统将 binary log 写入新的文件,或者有其他的需要,我们就可以使用FLUSH LOG,强制系统切换 binary log2 . reset master 指令清除所有 .index 文件中列出的 binary log 文件,并且重新开始记录新的 binary log 。有时候我们搭建了一个数据库的平台,后来我们这套数据库的数据转移走了,现在的这套MySQL 平 台 要 处 理 新 的 数 据 库 了 , 这 个 时 候 我 们 就 要 对 binary log 进 行 初 始 化 , 这 个 时 候 就 需要使用 reset master 指令清除所有的 binary log 文件,同时初始化 .index 文件。这个操作是一个破坏性的操作,执行后现有的 binary log 文件都会被清除第六节 其他一、)老版本的mysql中执行 'load data infile' 语句不会同步,因为在客户端也要学习这个语句,但是在客户端没有同样的文件存在可以导入。但新版本不存在这个问题。二、)mysql 5.0.3(master) => mysql 5.0.2(slave)mysql 5.0.4(master) => mysql 5.0.3(slave)同步就会失败。通常,slave是5.x版本的,可以用4.x/3.x版本的master与之同步。也就是说slave版本最好是比master版本高,这样才能兼容binary log格式。不过强烈建议二者使用同一个版本,除非不得已。三、)在master上show processlist;状态解释:1.) Sending binlog event to slavebinary log中有还未完成的事件,正在发送给slave。2.) Finished reading one binlog; switching to next binlog读完当前的binary log,正要切换到下一个bianry log。3.) Has sent all binlog to slave; waiting for binlog to be updated已经向slave发送了所有的binary log了,正在等待master上的binary log更新。4.) Waiting to finalize termination当前线程停止了,这个时间很短。在slave上show processlist;几个比较有用的状态解释:1.) Connecting to masterslave正尝试连接master2.) Waiting for master to send event等待master发送更多的更新事件。3.) Queueing master event to the relay log从master读取到了一个事件,正拷贝到relay log中去,以备执行它。4.) Waiting to reconnect after a failed master event read由于从master读取事件是发生错误(连接断开了),slave正在等待 master-connect-retry 秒之后重新连接master。5.) Reconnecting after a failed master event read重新连接master。连接确定之后,状态就变成 Waiting for master to send event 了。/usr/sbin/mysqld --defaults-file=/var/lib/mysql/my.cnf &/usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/data/my.cnf &CHANGE MASTER TO MASTER_HOST='192.168.1.182', MASTER_USER='rep', MASTER_PASSWORD='rep', MASTER_LOG_FILE='linux-02-bin.004', MASTER_LOG_POS=55;解压缩二进制包:tar zxf xxx.tar.gz.mv mysql-version-xx mysqlmv mysql /var/eyou/cd /var/eyou/mysql./scripts/mysql_install_dbcd datacp xx/my.cnf .vi my.cnf |
|
|