1、MYSQL 服务器复制配置最近修改于 2007-8-7 by yahoon这是根据我之前看的 MYSQL 复制的文档然后自己亲自实验的过程. 配置的功能比较简单.环境:主服务器:redhat9mysql 5.0.16机器名:dbmasterIP:192.168.0.111从服务器:redhat9mysql5.0.16机器名:dbslaveIP:192.168.0.100配置过程:整个过程与 MYSQL 文档中的复制设置步骤一一对应 ,只是具体化和标明了一些要注意的地方.如果有兴趣的朋友可以对照阅读, 会更加理解.1.确认两台服务器的 MYSQL 版本, 用 mysql V 命令查看注意: My
2、SQL 不同版本之间的 (二进制日志)binlog 格式可能会不一样,所以最好采用相同的版本.如果达不到要求,必须要保证 Master 的版本不能高于 Slave 版本2.在主服务器上为服务器设置一个连接账户。该账户必须授予 REPLICATION SLAVE 权限。我为了简单没做这一步,直接用 root 账户(注意 root 用户必须有远程访问的权限,有些基于安全考虑是没有打开的,20070807 增加).本机的话使用 127.0.0.1正常的步骤是:假定你的域为 ,想要创建用户名为 repl 的一个账户,从服务器可以使用该账户从你的域内的任何主机使用密码 slavepass 来访问主服务器
3、。要创建该 账户,可使用 GRANT 语句:mysql GRANT REPLICATION SLAVE ON *.* -TO repl% IDENTIFIED BY slavepass;如果想要在 Slave 上有权限执行 “LOAD TABLE FROM MASTER“ 或 “LOAD DATA FROM MASTER“ 语句的话,必须授予全局的 FILE 和 SELECT 权限:mysqlGRANT FILE,SELECT,REPLICATION SLAVE ON *.* TO repl% IDENTIFIED BY rep;在用户创建之后要使用 FLUSH PRIVILEGES 使权限生
4、效 ,20070807 增加3.在主服务器上执行 FLUSH TABLES WITH READ LOCK 语句来刷新表,同时阻止写操作.:mysql FLUSH TABLES WITH READ LOCK;然后对主服务器上的数据进行快照。(此时不要退出 mysql 的提示符,退出的话就解锁了.新开一个 ssh 窗口进行下面所说的归档打包操作 )创建快照最简单的途径是使用归档程序对主服务器上的数据目录中的数据库进行二进制备份。要使用 tar 来创建包括所有数据库的归档文件,进入主服务器的数据目录,然后执行命令:(注意下面的目录操作是在 bash 的提示符下进行,我用 shell来代表,还要注意执
5、行的命令是在哪台服务器上)shell tar -cvf /tmp/mysql-snapshot.tar .然后将归档文件复制到从服务器的/tmp 目录。在从服务器上,进入数据库的数据目录,并使用下述命令解压缩归档文件:shell tar -xvf /tmp/mysql-snapshot.tar当 FLUSH TABLES WITH READ LOCK 所置读锁定有效时(这就是刚刚所说不要退出mysql 提示符的原因),读取主服务器上当前的二进制日志名和偏移量值,直接输入命令SHOW MASTER STATUS.mysql SHOW MASTER STATUS;+-+-+-+-+| File |
6、 Position | Binlog_Do_DB | Binlog_Ignore_DB |+-+-+-+-+| mysql-bin.000045 | 947 | | |+-+-+-+-+File 列显示日志名,而 Position 显示偏移量。在该例子中,二进制日志值为 mysql-bin.000045 偏移量为 947。记录该值。以后设置从服务器时需要使用这些值。它们表示复制坐标,告诉从服务器应从该点开始从主服务器上进行更新。取得快照并记录日志名和偏移量后,可以在主服务器上重新启用写活动:mysql UNLOCK TABLES;4. 确保主服务器上 f 文件的mysqld部分包括一个 log
7、-bin 选项。该部分还应有一个 server-id=Master_id 选项,其中 master_id 必须为 1 到 2321 之间的一个正整数值。例如:mysqldlog-bin=mysql-binserver-id=1一般情况你打开 f 后,已经默认是这样的设置了, 里面内容看起来像下面这样:# Replication Master Server (default)# binary logging is required for replicationlog-bin=mysql-bin 在 4.1.9 版里面这段话是# Replication Master Server (defaul
8、t)# binary logging is required for replicationlog-bin (没有等号 )20070807 增加# required unique id between 1 and 232 - 1# defaults to 1 if master-host is not set# but will not function as a master if omittedserver-id = 1如果这些选项不存在,添加它们并且重启服务器. 在 binary logging(二进制日志)没有启用的情况下,服务器是不能称为复制主服务器的5.停止从服务器shell my
9、sqladmin -u root shutdown -p其 f 文件中添加下面的行:mysqldserver-id=slave_idslave_id 值同 Master_id 值一样,必须为 1 到 2321 之间的一个正整数值。并且,从服务器的 ID 必须与主服务器的 ID 不相同。例如:mysqldserver-id=2如果设置多个从服务器,每个从服务器必须有一个唯一的 server-id 值,必须与主服务器的以及其它从服务器的不相同。注意:这里的设置与上面的有很大不同. 其实默认的 f 中已经有相应的设置,前面已经说过,对于主服务器基本不用修改, 对于从服务器,修改也很简单 .(其实文件
10、中说的满清楚的,E 文好的应该没问题)必须将主服务器打开的那两个选项注释掉# Replication Master Server (default)# binary logging is required for replication# log-bin=mysql-bin在 4.1.9 版里面这句话是 log-bin (没有等号)20070807 增加# required unique id between 1 and 232 - 1# defaults to 1 if master-host is not set# but will not function as a master if
11、omitted# server-id = 1然后把从服务器的对应的选项打开# Replication Slave (comment out master section to use this)(省略 )# required unique id between 2 and 232 - 1# (and different from the master)# defaults to 2 if master-host is set# but will not function as a slave if omittedserver-id = 2 (对于多个从服务器,就依此类推,2,3,4)通过 FA
12、Q 中的说明, 推荐将以下选项打开 ,当主服务器 down 机,从充当主的时候有用.# binary logging - not required for slaves, but recommendedlog-bin6.如果对主服务器的数据进行二进制备份,启动从服务器之前将它复制到从服务器的数据目录中。确保对这些文件和目录的权限正确。你用来运行从服务器的系统帐号必须能够读写这些文件,就如同在主服务器上一样。7.启动从服务器。mysqld_safe -user=mysql /之前记录的偏移量返回:Query OK, 0 rows affected (0.01 sec)下面的表显示了字符串选项的最
13、大长度:Master_Host 60 Master_USER 16 Master_PASSWORD 32 Master_Log_File 25510.启动从服务器线程:mysql START SLAVE;执行这些程序后,从服务器应连接主服务器,并补充自从快照以来发生的任何更新。测试:在从服务器上查看mysql SHOW SLAVE STATUSG* 1. row *Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.0.111Master_User: rootMaster_Port: 3306Connect_
14、Retry: 60Master_Log_File: mysql-bin.000045Read_Master_Log_Pos: 1064Relay_Log_File: dbpi-relay-bin.000002Relay_Log_Pos: 352Relay_Master_Log_File: mysql-bin.000045Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild
15、_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 1064Relay_Log_Space: 352Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_
16、Behind_Master: 0红色标示显示出从服务器的两个线程已经启动.在从服务器上可以查看线程运行状态mysql SHOW PROCESSLISTG* 1. row *Id: 3User: rootHost: localhostdb: testCommand: QueryTime: 0State: NULLInfo: SHOW PROCESSLIST* 2. row *Id: 18User: system userHost: db: NULLCommand: ConnectTime: 43State: Waiting for master to send eventInfo: NULL*
17、3. row *Id: 19User: system userHost: db: NULLCommand: ConnectTime: 4294966771State: Has read all relay log; waiting for the slave I/O thread to update itInfo: NULL3 rows in set (0.00 sec)在主服务器上做一个 update 的语句, 从服务器立刻就会同步更新. 配置完成.说明:由于从服务器是通过读主服务器的二进制日志来实现自我更新的,所以对于对数据库进行修改的操作都要放在主服务器上执行,而从服务器只用来进行查询.(也就是只读不写的数据库操作).