MYsql 主从复制

一 安装MYSQL  

下载mysql-5.5.52-linux2.6-x86_64.tar.gz到/usr/local/src/
cd /usr/local/src/
tar zxvf mysql-5.5.52-linux2.6-x86_64.tar.gz
[root@localhost src]# mv mysql-5.5.52-linux2.6-x86_64 /usr/local/mysql
[root@localhost src]# useradd -s /sbin/nologin mysql
[root@localhost src]# cd /usr/local/mysql
[root@localhost mysql]# mkdir -p /data/mysql ; chown -R mysql:mysql /data/mysql
[root@localhost mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql
Installing MySQL system tables...
[root@localhost mysql]# cp support-files/my-large.cnf /etc/my.cnf
[root@localhost mysql]# vim /etc/my.cnf
[root@localhost mysql]# cp support-files/mysql.server /etc/init.d/mysqld
[root@localhost mysql]# vim /etc/init.d/mysqld
[root@localhost mysql]# /etc/init.d/mysqld start
[root@localhost mysql]# /usr/local/mysql/bin/mysql -uroot

主用户名: root   密码 mroot    192.168.128.133  

从用户名:root    密码 sroot     192.168.128.134

主从同步的用户名 repl   密码 123456

配置命令后  /usr/local/mysql/bin/mysql   直接用 mysql 命令

[root@localhost ~]# PATH=$PATH:/usr/local/mysql/bin
[root@localhost ~]# echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
[root@localhost ~]# source /etc/profile

主从上都创建数据库 testdb:

主:

mysql> create database testdb;

主导数据给testdb,先导出到123.sql  再将 123.sql导入给testdb;

[root@localhost mysql]# /usr/local/mysql/bin/mysqldump -uroot mysql > 123.sql
-- Warning: Skipping the data of table mysql.event. Specify the --events option explicitly.
[root@localhost mysql]# /usr/local/mysql/bin/mysql -uroot testdb < 123.sql

从:

mysql> create database testdb;

[root@localhost ~]# cd /usr/local/mysql
[root@localhost mysql]# scp root@192.168.128.133:/usr/local/mysql/123.sql /usr/local/mysql/
[root@localhost mysql]# mysql -uroot -psroot
[root@localhost mysql]# mysql -uroot -psroot testdb < 123.sql

二 

1、主从服务器分别作以下操作:
1.1、版本一致
1.2、初始化表,并在后台启动mysql
1.3、修改root的密码  

主: mysqladmin -uroot password 'mroot'

从: mysqladmin -uroot password 'sroot'

一、 修改主服务器master:
#vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin //[必须]启用二进制日志
server-id=1 //[必须]服务器唯一ID,默认是1,一般取IP最后一段

除了这两行是必须的外,还有两个参数,你可以选择性的使用:

binlog-do-db=testdb
binlog-ignore-db=databasename1,databasename2
binlog-do-db=需要复制的数据库名,多个数据库名,使用逗号分隔。binlog-ignore-db=不需要复制的数据库库名,多个数据库名,使用逗号分隔。这两个参数其实用一个就可以啦。

二、 修改从服务器slave:
#vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin //[不是必须]启用二进制日志
server-id=2 //[必须]服务器唯一ID,默认是1,一般取IP最后一段

找到 “server-id = 1” 这一行,改为 “server-id = 2” 总之不能让这个id和master一样,否则会报错。

另外在从上,选择性的增加如下其中一行,对应于主上增加的那行:

replicate-do-db=testdb
replicate-ignore-db=databasename1,databasename2

三、 /etc/init.d/mysql restart

四、主服务器:

[root@localhost mysql]# mysql -uroot -pmroot

mysql> grant replication slave on *.* to 'repl'@'192.168.128.134' identified by '123456'; 

mysql> flush tables with read lock;    先锁定主数据库 

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 |      401 | testdb       |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

mysql
> unlock tables; // 去从那配完再解锁
Query OK, 0 rows affected (0.00 sec)

[root@localhost mysql]# iptables -F     //主服务器要关闭防火墙,要不然从会    Slave_IO_Running: Connecting

五、从服务器:

[root@localhost mysql]# mysql -uroot -psroot

mysql> change master to master_host='192.168.128.133',
-> master_user='repl',master_password='123456',                //与上面的grant replication对应。
-> master_log_file='mysql-bin.000004',master_log_pos=401;

六、 mysql> unlock tables;         //主那解锁

七、从服务器 开启方从服制 

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave statusG

*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.128.133
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000004
          Read_Master_Log_Pos: 401
               Relay_Log_File: localhost-relay-bin.000002
                Relay_Log_Pos: 253
        Relay_Master_Log_File: mysql-bin.000004
             Slave_IO_Running: Yes     // 这里要yes 主服务器要关闭防火墙 iptables -F
            Slave_SQL_Running: Yes     // 这里要yes
              Replicate_Do_DB: testdb
          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: 401
              Relay_Log_Space: 413
              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: 1
1 row in set (0.00 sec)

 测试同步: 清空主数据库testdb 里的表 db

[root@localhost mysql]# mysql -uroot -pmroot
mysql> use testdb;
mysql> select count(*) from db;
+----------+
| count(*) |
+----------+
|        2 |
+----------+
1 row in set (0.00 sec)
mysql> truncate table db;
mysql> select count(*) from db;
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)

此时进从服务器  查看 db 应该为0 

[root@localhost mysql]# mysql -uroot -psroot
mysql> use testdb;
mysql> select count(*) from db;
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)

 遇见问题:

导致lave_IO_Running 为connecting 的原因主要有以下 3 个方面:1、网络不通    2、密码不对  3、pos不对  4、 server-id

发现服务器本地没有监听 3306    : netstat -an | grep 3306     注掉 skip-networking 就可以了。

 当主重启MYSQL 后 发现从Slave_SQL_Running: No

SET GLOBAL SQL_SLAVE_SKIP_COUNTER=N;  (N=1  或大于 1 )  指让从跳过多少个事件。  因为之前有事件执行失败。    

原文地址:https://www.cnblogs.com/carbon3/p/5864777.html