环境介绍:
采用多实例进行主从复制测试,多实例方法请参考网上其它文档,其实多实例和双服务器对于测试环境来说是一样的。 当前采用3306端口进程为Master,3307端口进程为Slave. Mysql版本: mysql> select version(); +-------------+ | version() | +-------------+ | 5.1.68 | +-------------+ 1 row in set (0.04 sec) 配置过程如下: 1.主库开启bin-log功能,配置server-id该参数在my.cnf中添加 vi /data3/3306/my.cnf …… [mysqld] server-id = 1 log-bin = /data3/3306/mysql-bin …… 可查看命令show variables like 'log_bin'; show variableslike 'server_id'; mysql> show variables like 'log_bin'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_bin | ON | +---------------+-------+ 1 row in set (0.00 sec) mysql> show variables like 'server_id'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | server_id | 1 | +---------------+-------+ 1 row in set (0.00 sec)
2.在主库上创建复制授权用户mysql>grant replication slave on *.* to rep@'10.0.0.%' identified by '123456'; QueryOK, 0 rows affected (0.19 sec) 对所有库所有表,授权rep用户只有复制的权限。 3.对数据库锁表只读mysql>flush tables with read lock; QueryOK, 0 rows affected (0.07 sec) 该命令退出当前连接数据库后,锁表功能就失效。 4.记录log-bin文件名和位置mysql>show master status; +------------------+----------+--------------+------------------+ |File | Position |Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ |mysql-bin.000002 | 340 | | | +------------------+----------+--------------+------------------+ 1row in set (0.00 sec) 该命令需要在锁表后执行,生产环境中每时都有数据写入,只有确保锁表后show master status才准确。 5.导出全部数据由于退出当前mysql登陆窗口,锁表功能就失效,需克隆一个会话进行全备。 [iyunv@Web01_n~]# mysqldump -B -A --events -S/data3/3306/mysql.sock|gzip >/tmp/3306mysql.sql.gz [iyunv@Web01_n~]# ll /tmp/3306mysql.sql.gz -rw-r--r--1 root root 136573 10-29 16:14 /tmp/3306mysql.sql.gz 导完库查看主库状态,确定bin-log信息没有变化 mysql>show master status; +------------------+----------+--------------+------------------+ |File | Position |Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ |mysql-bin.000002 | 340 | | | +------------------+----------+--------------+------------------+ 1row in set (0.00 sec) 注:由于我的数据库并没有设置用户名和密码,所以未指定-u -p参数。 6.解除锁表退出锁表登陆窗口或使用命令 unlock tables; mysql>flush tables with read lock; QueryOK, 0 rows affected (0.00 sec) mysql> mysql>quit Bye 或 mysql>unlock tables; QueryOK, 0 rows affected (0.00 sec) 7.从库配置文件配置[iyunv@Web01_n3307]# netstat -plnt |grep 3307 tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 11466/mysqld [iyunv@Web01_n3307]# kill 11466 [iyunv@Web01_n3307]# netstat -plnt |grep 3307 [iyunv@Web01_n3307]# vi /data3/3307/my.cnf …… [mysqld] server-id= 2 #如果ID和master一致,slave的IO线程会起不来 log-bin= /data3/3307/mysql-bin #从库上开启binlog日志功能,一般用于其它从库从这进行复制,也可不加这条命令 …… [iyunv@Web01_n3307]# mysqld_safe --defaults-file=/data3/3307/my.cnf & [4]11572 [iyunv@Web01_n3307]# 131029 16:56:10 mysqld_safe Logging to'/data3/3307/mysql_oldboy3307.err'. 13102916:56:10 mysqld_safe Starting mysqld daemon with databases from/data3/3307/data
[iyunv@Web01_n3307]# netstat -plnt|grep 3307 tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 11751/mysqld 杀掉原先进程,修改配置并重启。重启参数使用mysqld_safe,&是后台执行。 8.导入全部数据至从库解压备份的数据 [iyunv@Web01_n~]# ll /tmp/ -rw-r--r--1 root root 136573 10-29 16:14 3306mysql.sql.gz [iyunv@Web01_n~]# gzip -d /tmp/3306mysql.sql.gz #解压gz文件,并删除压缩包 [iyunv@Web01_n~]# ll /tmp/3306mysql.sql -rw-r--r--1 root root 502068 10-29 16:14 /tmp/3306mysql.sql 导入数据 [iyunv@Web01_n~]# mysql -S /data3/3307/mysql.sock </tmp/3306mysql.sql
9.从库设置change master语句binlog位置状态为主库show master status查看的位置状态 CHANGEMASTER TO MASTER_HOST='10.0.0.237', MASTER_PORT=3306, MASTER_USER='rep', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=340;
演示效果 mysql>CHANGE MASTER TO -> MASTER_HOST='10.0.0.237', -> MASTER_PORT=3306, -> MASTER_USER='rep', -> MASTER_PASSWORD='123456', -> MASTER_LOG_FILE='mysql-bin.000002', -> MASTER_LOG_POS=340; QueryOK, 0 rows affected (0.01 sec) 配置master的IP,端口,用户,密码,binlog文件名与位置。注意此处的MASTER_LOG_FILE与MASTER_LOG_POS的值为上面主库show master status得到
10.从库开启slave开关mysql>start slave; QueryOK, 0 rows affected (0.00 sec) 开启从库的IO线程和SQL线程。也可单独开启,START SLAVE IO_THREAD;START SLAVE SQL_THREAD; 11.从库查看同步状态mysql>show slave status\G ***************************1. row *************************** Slave_IO_State: Waiting formaster to send event Master_Host: 10.0.0.237 Master_User: rep Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000002 Read_Master_Log_Pos: 340 Relay_Log_File: relay-bin.000002 Relay_Log_Pos: 251 Relay_Master_Log_File: mysql-bin.000002 Slave_IO_Running: Yes Slave_SQL_Running: Yes #两个YES代表主从同步线程正常 Replicate_Do_DB: Replicate_Ignore_DB: mysql 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: 340 Relay_Log_Space: 400 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: 0 #查看主从同步延迟,延迟大则可能需要优化 Master_SSL_Verify_Server_Cert:No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: 1row in set (0.00 sec) 命令最后使用;是表格形式,使用\G是行形式。有些内容使用\G更直观。 12.主从同步测试在master上创建数据库及表,看是否同步。 [iyunv@Web01_n3307]# mysql -S /data3/3306/mysql.sock -e "create database yy1028;" [iyunv@Web01_n3307]# mysql -S /data3/3307/mysql.sock -e "show databases;" +--------------------+ |Database | +--------------------+ |information_schema | |mysql | |test | |test1 | |yy1028 | +--------------------+
主从同步测试成功!
其它: 1.在主库上执行show master status;为空问题 因为没有开启bin-log功能,或没有生效。在数据库里查看 show variables like '%log_bin%';看log-bin是否有on。 2. 控制binlog文件过期时间,在my.cnf中加入expire_logs_days = 7 参数,则7天后该binlog日志就自动删除。
|