zoukankan      html  css  js  c++  java
  • mysql主从复制实现数据库同步

      mysql主从复制相信已经用得很多了,但是由于工作原因一直没怎么用过。趁着这段时间相对空闲,也就自己实现一遍。尽管互联网上已有大把类似的文章,但是自身实现的仍然值得记录。

    环境:

    主服务器:centos 6.0 mysql 5.1.67-log IP:192.168.0.107
    从服务器:centos 6.0 mysql 5.1.67-log IP:192.168.0.109
    主服务器test数据库

    CREATE TABLE `menber` (
    `name` varchar(255) DEFAULT NULL default '',
    `id` int(11) NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
    insert into `menber` (`name`, `id`) values('zhangsan','1');
    insert into `menber` (`name`, `id`) values('lisi','2');
    insert into `menber` (`name`, `id`) values('王五','3');

    mysql默认配置文件,如不特殊指定默认为/etc/my.cnf

    mysql配置文件查找顺序:/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf

    配置:

    一、主服务器

    1.1、创建一个复制用户,具有replication slave 权限。

    mysql>grant replication slave on *.* to 'repl'@'192.168.0.109' identified by 'repl';
    mysql>flush privileges;

    1.2、编辑my.cnf文件

    vi /etc/my.cnf

    添加

      server-id=107

    并开启log-bin二进制日志文件(Mysql需要有/var/lib/mysql/目录的读写权限【可通过chown -R mysql:mysql /var/lib/mysql命令进行更改】

      log-bin=/var/lib/mysql/mysql-bin

    #指定绝对路径,否者会出现mysql运行show master status;时无法查看日志情况
    mysql> show master status;
    Empty set (0.00 sec)
    mysql> show binary logs;
    ERROR 1381 (HY000): You are not using binary logging

    其他扩展配置项: 

    binlog-do-db=mysql1 #需要备份的数据库名,如果备份多个数据库,重复设置这个选项 即可
    binlog-ignore-db=mysql2 #不需要备份的数据库名,如果备份多个数据库,重复设置这 个选项即可
    log-slave-updates=1 #这个参数一定要加上,否则不会给更新的记录些到二进制文件 里
    slave-skip-errors=1 #是跳过错误,继续执行复制操作(可选)

    1.3、重启mysql数据库

    service mysqld restart

    1.4、设置读锁

    mysql>flush tables with read lock;

    1.5、得到binlog日志文件名和偏移量(此处记住File名称和Position值,后面slave服务器配置时需要用到

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

        

    1.6、备份要同步的数据库

    mysqldump test > test.sql

    1.7、解锁

    mysql>unlock tables;

        

    二、从服务器(192.168.0.109)

    将master(192.168.0.107)备份的数据库数据恢复到slave从服务器(192.168.0.109)

    2.1、编辑my.cnf文件

    vi /etc/my.cnf

    添加

    server-id=109

    2.2、重启从数据库

    service mysqld restart

    2.3、对从数据库进行相应设置

      此处要注意logfile的名称和position的值,其余host、user和password为主数据库设置的账号和密码

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

    mysql> change master to
       -> master_host='192.168.0.107',
       -> master_user='repl',
       -> master_password='repl',
       -> master_log_file='mysql-bin.000001',
       -> master_log_pos=713;

    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.0.107
    Master_User: repl
    Master_Port: 3306
    Connect_Retry: 60
    Master_Log_File: mysql-bin.000001
    Read_Master_Log_Pos: 1079
    Relay_Log_File: mysqld-relay-bin.000004
    Relay_Log_Pos: 251
    Relay_Master_Log_File: mysql-bin.000001
    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: 1079
    Relay_Log_Space: 407
    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)

    ERROR:
    No query specified

    在这里主要是看:

      Slave_IO_Running=Yes
      Slave_SQL_Running=Yes

    如果出现Slave_IO_Running: No或Slave_SQL_Running: NO,需要重做2.3、对从数据库进行相应设置

    三、测试:
      上述项配置完以后可查看master和slave上线程的状态。在master上,你可以看到slave的I/O线程创建的连接:在master上输入show processlistG;

    mysql> show processlistG;
    *************************** 1. row ***************************
         Id: 4
       User: root
       Host: localhost
         db: NULL
    Command: Query
       Time: 0
      State: NULL
       Info: show processlist
    *************************** 2. row ***************************
         Id: 19
       User: repl
       Host: 192.168.0.109:42337
         db: NULL
    Command: Binlog Dump
       Time: 183
      State: Has sent all binlog to slave; waiting for binlog to be updated
       Info: NULL
    2 rows in set (0.00 sec)
    
    ERROR: 
    No query specified

      3.1、在主数据库:192.168.0.107上添加新数据

    insert into `menber` (`name`) values('李八');insert into `menber` (`name`) values('苍井空');

    3.2从数据库:192.168.0.109上查看数据库

    mysql> select * from menber;
    +-----------+----+
    | name      | id |
    +-----------+----+
    | zhangsan  |  1 |
    | lisi      |  2 |
    | 王五    |  3 |
    | 李八    |  4 |
    | 苍井空 |  5 |
    +-----------+----+
    5 rows in set (0.02 sec)

      此时数据已经成功复制到slave从数据库192.168.0.109上。

  • 相关阅读:
    LeetCode偶尔一题 —— 617. 合并二叉树
    《剑指offer》 —— 链表中倒数第k个节点
    《剑指offer》 —— 青蛙跳台阶问题
    《剑指offer》—— 二维数组中的查找
    《剑指offer》—— 替换空格
    《剑指offer》—— 合并两个排序的链表
    《剑指offer》—— 礼物的最大价值
    生成Nuget 源代码包来重用你的Asp.net MVC代码
    Pro ASP.Net Core MVC 6th 第四章
    Pro ASP.NET Core MVC 6th 第三章
  • 原文地址:https://www.cnblogs.com/rwxwsblog/p/4542417.html
Copyright © 2011-2022 走看看