Mysql
的主从复制至少是需要两个
Mysql
的服务,当然
Mysql
的服务是可以分布在不同的服务器上,也可以在一台服务器上启动多个服务。
(1)
首先确保主从服务器上的
Mysql
版本相同
(2)
在主服务器上
,
设置一个从数据库的账户
,
使用
REPLICATION SLAVE
赋予权限
,
:
mysql> GRANT REPLICATION SLAVE ON *.* TO 'zone'@'172.16.1.214' IDENTIFIED BY
'123456';
Query OK, 0 rows affected (0.13 sec)
mysql> FLUSH PRIVILEGES;
我很少用这个命令刷新,不过设计权限的操作,还是刷新一下的好,毕竟是指刷新权重;
(3)
修改主数据库的配置文件
my.cnf,
开启
BINLOG
,并设置
server-id
的值,修改之后必须重启
Mysql
服务
[mysqld]
log-bin = mysql-bin
server-id=1
binlog-do-db=zone #需要备份的数据库名,如果备份多个数据库,重复设置这个选项即可
binlog-do-db=zone_credits
binlog-do-db=zone_main
binlog-do-db=zone_mood
binlog-ignore-db=mysql #不需要备份的数据库名,如果备份多个数据库,重复设置这个选项即可
log-slave-updates #这个参数一定要加上,否则不会给更新的记录些到二进制文件里(我没有加,应该是默认就记录到二进制文件里的,待验证)
(4)
之后可以得到主服务器当前二进制日志名和偏移量,这个操作的目的是为了在从数据库启动后,从这个点开始进行数据的恢复
mysql> show master status\G;
*************************** 1. row ***************************
File: mysql-bin.000043
Position: 355695
Binlog_Do_DB: zone,zone_credits,zone_main,zone_mood
Binlog_Ignore_DB:
1 row in set (0.00 sec)
(5)
好了,现在可以停止主数据的的更新操作,并生成主数据库的备份,我们可以通过
mysqldump
到处数据到从数据库,当然了,你也可以直接用
cp
命令将数据文件复制到从数据库去。
注意在导出数据之前先对主数据库进行
READ LOCK
,以保证数据的一致性
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.19 sec)
之后是
mysqldump
mysqldump -S /data/mysql_3306/mysql.sock > master.sql
最好在主数据库备份完毕,恢复写操作
mysql> unlock tables;
Query OK, 0 rows affected (0.28 sec)
(6)
将刚才主数据备份的
master.sql
复制到从数据库,进行导入
(7)
接着修改从数据库的
my.cnf,
增加
server-id
参数
,
指定复制使用的用户
,
主数据库服务器的
ip,
端口以及开始执行复制日志的文件和位置
[mysqld]
server-id=2
log_bin = mysql-bin
#master-host=172.16.1.119
#master-user=root
#master-password=111111
#master-port=3306                                      
#以上注释的原因:
Mysql版本从5.1.7以后开始就不支持“master-host”类似的参数;
查看mysql_error.log中的报错信息如下;
110105 13:38:00 mysqld_safe mysqld from pid file /data/mysql_3306/mysql.pid ended
110105 13:38:06 mysqld_safe Starting mysqld daemon with databases from /data/mysql_3306/data
InnoDB: The InnoDB memory heap is disabled
InnoDB: Mutexes and rw_locks use GCC atomic builtins
110105 13:38:06  InnoDB: highest supported file format is Barracuda.
110105 13:38:06 InnoDB Plugin 1.0.6 started; log sequence number 44309
110105 13:38:06 [ERROR] /usr/local/webserver/mysql/libexec/mysqld: unknown variable 'master-host=192.168.7.202'
110105 13:38:06 [ERROR] Aborting
110105 13:38:06  InnoDB: Starting shutdown...
110105 13:38:08  InnoDB: Shutdown completed; log sequence number 44319
110105 13:38:08 [Note] /usr/local/webserver/mysql/libexec/mysqld: Shutdown complete
所以只能注释掉
replicate-do-db=zone
replicate-do-db=zone_credits
replicate-do-db=zone_main
replicate-do-db=zone_mood 
(8)
在从服务器上
,
启动
slave
进程
当我在执行start slave这条命令时,系统提示
ERROR 1200 (HY000): The server is not configured as slave; fix in config file or with CHANGE MASTER TO,
执行show slave status;又提示Empty set (0.00 sec),想不通问题在哪里
后来发现,原来slave已经默认开启,要先关闭再开启
执行 slave stop;
再执行
mysql>change master to master_host='172.16.1.119',master_user='zone',master_password='123456', master_log_file='mysql-bin.000043' ,master_log_pos=355695; 
然后
mysql> start slave;
查看是否成功呗
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.16.1.119
Master_User: zone
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000043
Read_Master_Log_Pos: 355695
Relay_Log_File: mysql_3306-relay-bin.000002
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000043
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: zone,zone_credits,zone_main,zone_mood
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: 355695
Relay_Log_Space: 414
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:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 193300
1 row in set (0.00 sec)
ERROR:
No query specified
真是折磨我好久。。。。。。学习能力太差了。。。。。。