Mysql主从同步复制总结
经过这两天实验和查资料,对Mysql的同步复制有了一定了解。把相关的结论记下来。
建议:在同步之前,2台Mysql的数据库 数据要一致,就是先把要备份的数据库导入到从slave服务器上。这样可以避免同步出错。
在已经正常同步的情况下:
下面内容参考了(imysql.cn),测试是亲自操作的。
如果master当机或者slave连接断开,slave会定期尝试连接到master上直到能重连并且等待更新。重试的时间间隔由 –master-connect-retry 选项来控制,它的默认值是60秒。
每个slave都记录了它关闭时的日志位置。msater是不知道有多少个slave连接上来或者哪个slave从什么时候开始更新。
###测试 主############
mysql> select * from demo;
+—————————–+
| title |
+—————————–+
| duliang |
| 杜亮 |
| 解决同步故障 |
| 午饭后查看同步正常 |
| 主正常,从重启 |
| master boot,slave boot |
| s server stop,master insert |
+—————————–+
7 rows in set (0.00 sec)
mysql> show master status;
+—————–+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+—————–+———-+————–+——————+
| mysqllog.000010 | 337 | gb | |
+—————–+———-+————–+——————+
1 row in set (0.00 sec)
###测试 从############
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.10
Master_User: root
Master_Port: 3308
Connect_Retry: 60
Master_Log_File: mysqllog.000010
Read_Master_Log_Pos: 337
Relay_Log_File: 共享服务器-relay-bin.000023
Relay_Log_Pos: 234
Relay_Master_Log_File: mysqllog.000010
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: 337
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
mysql> select * from demo;
+—————————–+
| title |
+—————————–+
| duliang |
| 杜亮 |
| 解决同步故障 |
| 午饭后查看同步正常 |
| 主正常,从重启 |
| master boot,slave boot |
| s server stop,master insert |
+—————————–+
7 rows in set (0.00 sec)
mysql>
####结束###############
相关问答 请参考 http://www.imysql.cn/node/61
问: master还在运行中,如何在不停止它的情况下配置slave?
答: 需要设计几个选项参数。如果已经有了master的备份并且记录了数据快照二进制日志文件名以及偏移位置(运行 SHOW MASTER STATUS 查看结果),执行以下步骤:
确定slave指定了一个唯一的服务器编号。
在slave上执行如下语句,把一些选项值改成实际值:
mysql> CHANGE MASTER TO
-> MASTER_HOST=’master_host_name’,
-> MASTER_USER=’master_user_name’,
-> MASTER_PASSWORD=’master_pass’,
-> MASTER_LOG_FILE=’recorded_log_file_name’,
-> MASTER_LOG_POS=recorded_log_position;
在slave上执行 SLAVE START语句。
问:是否slave总是需要连接到master?
答:不,非必需。slave可以好几小时甚至几天关闭或者不连接master,然后重连再取得更新操作日志。例如,可以在拨号链接上设置一个mater/slave关系,拨号可能只是零星的不定期的连接。这种做法隐含的是,在任何指定的时间里,除非使用特殊的度量标准,否则slave不能保证总是能和master保持同步。在未来,有个选项可以阻止master,除非至少有一个slave在同步中。
问:怎么知道比master晚了多少?也就是说,怎么知道slave最后同步的时间?
答:如果slave是4.1.1或者更高,只需查看 SHOW SLAVE STATUS 结果中的 Seconds_Behind_Master 字段。对于老版本,可以用以下办法。如果在slave上执行 SHOW PROCESSLIST 语句结果显示SQL线程(对MySQL 3.23则是slave线程)正在运行,这就意味着该线程至少从master读取一个更新操作事件。详情请看”6.3 Replication Implementation Details”。
当SQL线程执行一个master上读取的更新操作事件时,它把自己的时间改成事件的时间(这也就是 TIMESTAMP 也要同步的原因)。在SHOW PROCESSLIST 结果中的 Time 字段中,slave的SQL线程显示的秒数就是最后一次同步的时间戳和slave本机的实际时间相差秒数。可以根据这个值来判断最后同步的时间。注意,如果slave已经从master断开好几个小时了,然后重新连接,就能看到slave的
SHOW PROCESSLIST 结果中的SQL线程的Time 字段的值类似3600。这是因为slave正在执行一个小时前的语句。
您好,我在你这里看到了mysql乱码问题的解决,我有的是mysql5.1.36,集合在WAMPSERVER2.0中,在my.ini里没有找到网上说的:mysqld –default-character-set这个口令,请问怎么解决这个乱码问题啊?
1、首先,得确定你的程序的编码是什么GB2312,还是UTF-8
2、查看建立的数据库 及 表的字符集
3、在你写的程序中,数据库连接类加上SET NAMES ‘GBK’,如果你的数据库编码是UTF-8则:SET NAMES ‘UTF8′
注你说的:在my.ini里没有找到网上说的:mysqld –default-character-set这个口令
答:这个是mysql命令行,在my.ini里是没有的。应该是这个选取项:default-character-set=gbk,gbk是我mysql服务器的字符集。
php服务器,我都是单独安装的,在安装mysql的时候,可以设定字符集,我的my.ini里:default-character-set=gbk如:
[client]
port=3308
[mysql]
default-character-set=gbk