Mysql主从复制

        Mysql可以在window和linux平台进行使用,这里使用linux的作为mysql的系统环境,实现mysql的主从复制,使用虚拟机安装centos7的linux环境,mysql版本使用5.6。

一:环境准备

   虚拟机安装centos7可以参考:http://www.centoscn.com/image-text/setup/2014/0723/3341.html

   Cenos7安装mysql可以参考:

   http://www.centoscn.com/mysql/2016/0315/6844.html

    navicat连接mysql:http://www.cnblogs.com/yjdcoder/p/5927358.html

     注意开放mysql的端口:

    firewall-cmd --permanent--zone=public --add-port=3306/tcp

    firewall-cmd --permanent --zone=public--add-port=3306/udp

    firewall-cmd –reload   设置新的防火墙规则生效

二:Mysql主重复制

场景描述:

主数据库服务器:192.168.9.161,mysql已经安装,并且无应用数据。

主数据库服务器:192.168.9.163,mysql已经安装,并且无应用数据。

2.1主服务器进行的操作

1,在192.168.9.161机器上启动mysql服务,输入:sudo systemctl start mysqld;

2,为了方便我这里使用root用户登入mysql,mysql -u root –p,输入密码进行登入。(也可以自己创建一个新的用户,用于主从服务器的操作,注意需要给这个用户授权)

3,授权给从数据库服务器,使从数据库服务器的用户能操作主数据库:

GRANT REPLICATION SLAVE ON *.* to 'root'@'192.168.9.163' identifiedby ‘root’;

4,修改mysql的配置文件my.cnf:

 [mysqld]

# Remove leading # to turn on a very important data integrityoption: logging

# changes to the binary log between backups.

 log_bin

#

# Remove leading # to set options mainly useful for reportingservers.

# The server defaults are faster for transactions and fastSELECTs.

# Adjust sizes as needed, experiment to find the optimal values.

# join_buffer_size = 128M

# sort_buffer_size = 2M

# read_rnd_buffer_size = 2M

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

server-id=22

# Disabling symbolic-links is recommended to prevent assortedsecurity risks

symbolic-links=0

# Recommended in standard MySQL setup

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

#log-bin=/var/log/mysqld/mysql-bin

[mysqld]

character_set_server = utf8

[mysql]

default-character-set = utf8

注意:

1)去掉log_bin的注释,开启mysql的操作日志

2)设置server-id=22,server-id的值要在mysql主从服务器中唯一,建议取ip的最后一个字段,比如我这里可以取161。

5,关闭主数据库的服务,重启主数据库

   systemctl stop mysqld;

   systemctl start mysqld;

6,查看主数据库的状态

   登入mysql数据库,输入:show master status命令,看到如下效果:


记录上面图片的file和position的值,在后面配置从服务器的时候需要使用。

注意:

如果在前面没开启log_bin,那么输入:showmaster status,不会有数据出现,效果如下:

上面的图片显示的是一个空的结果,这时候就需要注意开启mysql操作的日志了,mysql的版本不同可能开启mysql操作日志不一样,如果你的版本里面没有log_bin开启mysql操作日志的就需要网上找相关资料进行处理了。

 

2.2配置从服务器

1,修改从服务器的mysql的配置文件,vi /etf/my.cnf

# log_bin

#

# Remove leading # to set options mainly useful for reportingservers.

# The server defaults are faster for transactions and fastSELECTs.

# Adjust sizes as needed, experiment to find the optimal values.

# join_buffer_size = 128M

# sort_buffer_size = 2M

# read_rnd_buffer_size = 2M

datadir=/var/lib/mysql#/usr/local/mysq/data/mysql #/var/lib/mysql

socket=/var/lib/mysql/mysql.sock#/usr/local/mysq/data/mysql/mysql.sock#/var/lib/mysql/mysql.sock

character_set_server = utf8

server-id = 10

 

# Disabling symbolic-links is recommended to prevent assortedsecurity risks

symbolic-links=0

 

# Recommended in standard MySQL setup

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

 

[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

[mysql]

default-character-set = utf8

注意:

1)需要给从服务器的mysql的配置文件配置server-id = 10,并确保这个id没有被别的服务所使用

2,重启mysql服务,登入mysql,这里我使用的登入用户也是root。

3,执行同步sql语句,

   mysql> change masterto

master_host='192.168.9.161',

master_user='root',

master_password='root',

master_log_file='mysql-bin.000015',

master_log_pos=690;

 

master_host:主服务器的ip

master_user:使用主服务器mysql的用户

master_password:对应用户的密码

master_log_file:数据库操作的日志文件

master_log_pos:读取日志文件的起始位置

4,正确执行同步sql后,需要启动Slave同步进程,启动命令:start slave

5,主从同步检查,使用show slavestatus\G命令,下面是正常输出的结果:

 

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.9.161
                  Master_User: root
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysqld-bin.000015
          Read_Master_Log_Pos: 690
               Relay_Log_File: mysqld-relay-bin.000010
                Relay_Log_Pos: 854
        Relay_Master_Log_File: mysqld-bin.000015
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          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: 690
              Relay_Log_Space: 1192
              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: 22
                  Master_UUID: 6d07bacc-4100-11e7-800e-000c2922ed86
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
1 row in set (0.00 sec)

注意:

1)要确保   Slave_IO_Running: Yes,Slave_SQL_Running: Yes

     这两个值都为yes则表示状态正常,否则说明配置有问题。           

2)如果主服务器已经存在应用数据,则在进行主从复制时,需要做以下处理:

(1)主数据库进行锁表操作,不让数据再进行写入动作

mysql> FLUSH TABLES WITH READ LOCK;

(2)查看主数据库状态

mysql> show master status;

(3)记录下 FILE及 Position 的值。

将主服务器的数据文件(整个/opt/mysql/data目录)复制到从服务器,建议通过tar归档压缩后再传到从服务器解压。

(4)取消主数据库锁定

mysql> UNLOCK TABLES;

 

2.3验证主从复制效果

1,主服务器的操作

    在主服务器的数据库上创建first_db: create database first_db;

   在主服务器的first_db数据库中,创建表first_tb:

DROP TABLE IF EXISTS `first_tb`;

CREATE TABLE `first_tb` (

  `id` int(11) NOT NULLAUTO_INCREMENT,

  `name` varchar(30)DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;


    在主服务器上的表first_tb中插入记录:

    insert into first_tb(name) values ('jacktest13');

   2,在从服务器上查看

  查看创建的数据库:show databases;


通过上面的图可知,first_db数据库已经生成。

使用use first_db;show tables;命令查看表


通过上图,可知表已经创建。

使用select * from first_tb;命令查看表里面的数据。结果如下:


可以看到数据已经插入。记录已经存在,到这里整个主从复制的过程就完成了。

注意:

手动往从库插入数据,主库的数据不变,还会导致主从复制失败,需要修改从数据库的同步信息比如修改下面的命令:

stop slave;

changemaster to master_log_file='mysqld-bin.000011',master_log_pos=1230;

start slave;

 

参考:

http://www.cnblogs.com/luckcs/articles/2543607.html

http://blog.csdn.net/cutesource/article/details/5710645

 

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐