Mysql数据库主从同步复制实践
Mysql数据库主从同步复制备份,用了一个下午和一个上午时间终于OK了。唯一的问题就是从slave安装时编码设置为latin1,同步的中文数据在cmd下显示乱码。真正用于生产环境中编码最好一致!
测试环境:
主:XP mysql5.0.27 3308 gbk编码 无线网络连接192.168.1.9
从:XP mysql5.0.27 3306 latin1编码 本地连接 192.168.1.36(配置时不需要用到这个IP)
注:2台mysql服务器能ping通,而且在从服务器上能登陆主mysql服务器;如果能ping通而连不上,把主服务器的操作系统防火墙端口3308设为充许。
目标:同步主下的gb数据库
主:已存在gb数据库
从:手工新建同名数据库gb,数据可以从主mysql服务器上导出再导入进来,这样可以保证数据库的完整性。
一、配置主mysql服务器
1、为从服务器分配一个连接账户,REPLICATION CLIENT和REPLICATION SLAVE权限就可以了,我为了方便用了root账号:)
2、配置my.ini
->文本最后添加如下:
#duliang_add start
server-id=1
#设置需要记录log 可以设置log-bin=homemysqlmysqllog 设置日志文件的目录,
#其中mysqllog是日志文件的名称,mysql将建立不同扩展名,文件名为mysqllog的几个日志文件。
log-bin = D:Program FilesMySQLMySQL Server 5.0duliang_addloogmysqllog
#指定需要日志的数据库
binlog-do-db=gb
#duliang_add end
->cmd下:重启主mysql
net stop mysql
net start mysql
3、进入mysql,输入命令show master status 命令看日志情况。
mysql> show master status;
+—————–+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+—————–+———-+————–+——————+
| mysqllog.000006 | 1254 | gb | |
+—————–+———-+————–+——————+
1 row in set (0.00 sec)
二进制日志值为mysqllog.000006偏移量为1254,同步的数据为gb。记录该值以后设置从服务器时需要使用这些值。它们表示复制坐标,告诉从服务器应从该点开始从主服务器上进行更新。
二、配置从mysql服务器
1、配置my.ini
->文本最后添加如下:
#duliang add start
server-id=2
master-host=192.168.1.9 #主 的IP地址
master-user=root #同步用户帐号
master-password=duliang #主 数据库的密码
master-port=3308
master-connect-retry=60 #预设重试间隔60秒
replicate-do-db=gb #设置slave只做gb数据库的更新
#duliang add end
->重启
下面2句是参考网友 丁丁笔迹 的:
注意:由于设置了slave的配置信息,mysql在数据库目录下生成master.info
所以如有要修改相关slave的配置要先删除该文件。否则修改的配置不能生效。
2、用show slave status\G;
检查Slave_IO_Running和Slave_SQL_Running是否都是Yes;
查看
Slave_IO_State字段:
1.空 //复制没有启动
2.Connecting to master//没有连接上master
3.Waiting for master to send event//已经连上
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.9
Master_User: duliang
Master_Port: 3308
Connect_Retry: 60
Master_Log_File: mysqllog.000006
Read_Master_Log_Pos: 1254
Relay_Log_File: 共享服务器-relay-bin.000004
Relay_Log_Pos: 737
Relay_Master_Log_File: mysqllog.000006
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: gb
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: 1254
Relay_Log_Space: 737
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
1 row in set (0.00 sec)
ERROR:
No query specified
3、如果出现了:
Slave_IO_Running: No
或者
Slave_SQL_Running: No
的情况,可通过如下解决:
(1)、确定分配置给从的账号可以远程登陆主mysql服务器,这是关键。
(2)、可能是二进制File和Position产生的问题
<1> 首先停掉Slave服务:slave stop;
<2> 查看主服务器状态 mysql> show master status;
+—————–+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+—————–+———-+————–+——————+
| mysqllog.000006 | 1254 | gb | |
+—————–+———-+————–+——————+
1 row in set (0.00 sec)
<3> 在从slave上做手工同步
change master to
> master_host=’192.168.1.9′,
> master_user=’root’,
> master_password=’duliang’,
> master_port=3308,
> master_log_file=’mysqllog.000006′,
> master_log_pos=1254;
<4> mysql> slave start;
<5>再查看从slave的状态
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.9
Master_User: duliang
Master_Port: 3308
Connect_Retry: 60
Master_Log_File: mysqllog.000006
Read_Master_Log_Pos: 1254
Relay_Log_File: 共享服务器-relay-bin.000005
Relay_Log_Pos: 234
Relay_Master_Log_File: mysqllog.000006
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: gb
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: 1254
Relay_Log_Space: 234
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
1 row in set (0.00 sec)
ERROR:
No query specified
正常了,也可以用show processlistG;查看。
Demo图:

