mysql主从同步配置

最近在做mysql主从配置,顺便把做完的东西写一总结

一、准备工作:

   1.两台服务器主机,操作系统为linux,如果没有可以用vm开两个虚拟机( Mysql的主从复制至少是需要两个Mysql的服务,当然Mysql的服务是可以分布在不同的服务器上,也可以在一台服务器上启动多个服务)

   主服务器(master)IP:192.168.0.240

   从服务器(slave)IP:192.168.0.242

   2.mysql安装包,最好保证主,从服务器的Mysql版本一致,本文使用的版本是5.5。


二、在主、从服务器上安装mysql:

 我们采用rpm包安装,具体安装参考前面的http://1145004.blog.51cto.com/1135004/1251553

 注意:采用rpm安装的Mysql是没有my.cnf文件的,所以我们须分别将主、从服务器的/usr/share/mysql/my-medium.cnf复制到/etc目录下并重新命名为my.cnf.


三、配置主服务器:

   1.使用vim /etc/my.cnf命令打开my.cnf,然后在[mysqld]中添加如下字段(不是要my.cnf最后增加,会出错的):

      log-bin=/var/log/mysql/mysql-bin.log #确保这个目录和文件存在,如果不存就手动创建。

      server-id=1

注:还可以配置同步指定的数据库,具体不再详解。

       2.重起mysql服务:service mysql restart.

       3.mysql>show master status\G命令查看,如果出现以下内容表示正常:

File: mysql-bin.000003
          Position: 243
          Binlog_Do_DB:
          Binlog_Ignore_DB:
          1 row in set (0.00 sec)

注:这里须要我们记住file,和position这两个值,从库用到。

       4.现在我们要导出数据之前,须要停掉主库,不让新的数据写入主库之中,以便带来主、从库的数据是相同的,所以我们要将表锁住:

mysql> flush tables with read lock;
Query OK, 0 rows affected (0.19 sec)

5.使用exit,退出mysql,现在开始将主库导出数据导到/home/test.sql(并命名为test.sql):


mysqldump -h127.0.0.1 -uroot -p3306  -p test > /home/test.sql

   我们来解释下这段代码:-h127.0.0.1为本机地址,-uroot为用户名;-p3306为端品号;-p为密码,这里密码为空;test为要导出的数据库,如果只想导出库中的一张表就是xx.xx,前者为库名,后者为表名。

   6.现在要将mysql的表解锁:

mysql>unlock tables;


   7.将导出的sql文件传送到从服务器里的home目录下:

cd /home
scp test.sql [email protected]:/home/

   现在可以进入从服务器的/home目录查看是否已经传过去了。

   8.现在要创建一个用户并授权给从服务器:

mysql> GRANT REPLICATION SLAVE ON *.* TO 'water'@'192.168.0.242' IDENTIFIED BY
'123456';

   可以在通过从库登陆来验证是否成功,或者从主库的mysql.user表里查看是否有记录了。

  9.有时要关闭防火墙,我当时就是因为没关闭防火墙,弄了一天没搞定。

    使用命令:service iptables stop

到这里主服务器都配置完成了。


四、配置从服务器(我们采用手动来配置):

   1.同样使用vim /etc/my.cnf命令,在my.cnf中的[mysqld]后面加上这两个字段:


server-id=2
log_bin = /var/log/mysql/mysql-bin.log

   和主服器差不多,确保[mysqld]后面的server-id只有一个,不然会出错。


   2.重起mysql服务:service mysql restart.

       3.将/home/test.sql导入到数据库中:source /home/test.sql

       4.进入mysql,使用:

mysql>change master to
>master_host='192.168.0.240',
>master_user='water',
>master_password='123456',
>master_log_file='mysql-bin.000003',
>master_log_pos=243;

      解释下最后面句话,前面几句基本能看得懂,master_log_file就是主库生成的文件,从库是根据这个文件来进行跟踪的,master_log_pos就是从哪个位置开始。因为有这两个,所以主、从库得以数据一样。

   5.启动从库:

mysql>slave start

   6.查看配置成功:

mysql >show slave status\G

   如果出现下类似:


Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.124.51

Master_User:AffairLog

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: log.000027

Read_Master_Log_Pos: 3151

Relay_Log_File: localhost-relay-bin.000379

Relay_Log_Pos: 245

Relay_Master_Log_File: log.000027

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Replicate_Do_DB: database1,database2

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: 3151

Relay_Log_Space: 543

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:

1 row in set (0.00 sec)

表示成功,我们最关心就是

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Slave_IO_Running:连接到主库,并读取主库的日志到本地,生成本地日志文件

Slave_SQL_Running:读取本地日志文件,并执行日志里的SQL命令。

这两个,只有这两个同时为yse表示配置成功。


五、问题:

   1.

       主从同步出现一下错误:

       Slave_IO_Running: Connecting
       Slave_SQL_Running: Yes

   解决方法:

   导致lave_IO_Running 为connecting 的原因主要有以下 3 个方面:

   1)、网络不通,或者防火墙阻止
   2)、密码不对
   3)、pos不对 。有了这三点可以对照着排除,找到错误。

   2.有时候还可以使用如下方法来解决主、从配置错误:


mysql> slave stop;
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> slave start;


你可能感兴趣的:(mysql,主从)