MySQL复制之主从数据库设置 @ 胡巴 | 星期六,七月 14 日,2018 年 | 5 分钟阅读 | 更新于 星期二,九月 28 日,2021 年

最近又自己弄了台小服务器,学习了下mysql的主从数据库配置,记录一下配置过程,其实是mariadb的,但是应该都差不多。整个过程配置起来还是比较简单的,没有遇到什么坑,嘿嘿!

开启主库的bin_log

编辑my.cnf文件,在里面添加如下信息:

# 这里的mysql-bin可以自己定义,是bin_log的文件名字的一部分
log_bin = mysql-bin
# 必须指定的唯一服务器ID
server_id = 100

添加完成后保存并退出,重新启动MySQL服务器

启动后可以登录mysql,使用下面命令看看是否已经成功开启了bin_log

show master status;

命令执行完成后,如果看到如下信息,则表示已经开启了bin_log日志啦

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      245 |              |                  |
+------------------+----------+--------------+------------------+

还可以执行下面的命令来看一下:

show variables like '%log_bin%';

显示内容如下:

+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| log_bin                         | ON    |
| log_bin_trust_function_creators | OFF   |
| sql_log_bin                     | ON    |
+---------------------------------+-------+

2.OK,主库的bin_log已经开启啦。接着我们来创建一个账号并赋予一些权限。

    grant replication slave,replication client on *.* to slave@'126.24.6.*' identified by 'yourpass'

3.账号创建好了,因为我这个主库是有一定数据的,所以现在需要将主库的已有数据先备份到从库一份。这里备份的方式有很多中,可以根据自己需要进行选择。我这里选择使用mysqldump的方式。【这里注意要给相应的用户设置一下登录的IP哦,否则可能执行不成功呢!】】还有一点需要自己注意一下,我这里复备份了所有库,你备份时可以根据实际需要进行备份就行。】【在这里执行之前,记得show master status看下position,后面从库启动复制时会用到。】

    mysqldump --single-transaction --all-databases --master-data=1  -uroot -pyourpass |mysql --host=47.94.5.239 -uroot -pyourpass

上面的命令执行视数据量大小执行时间应该会不同,我的数据量不大,所以几秒中就执行好了。如果数据量大的话,又不想影响应用的使用,建议采用其他的备份方式。例如:Percona Xtrabackup

4.好了,可以设置一下从库的my.cnf配置文件了,这里我把从库的bin_log也开起来,虽然开启bin_log可能会增加一些开销,但是还是有必要的,因为在进行主从互换,或者数据恢复时,bin_log应该还是很有用的。

编辑从库my.cnf文件,在里面添加如下信息:

# 这里的mysql-bin可以自己定义,是bin_log的文件名字的一部分
log_bin = mysql-bin
# 必须指定的唯一服务器ID
server_id = 101
# 指定中继日志的位置
relay_log=/var/log/mariadb/mysql-relay-bin
# 允许从库将其重放的事件也记录到自身的二进制日志中
log_slave_updates=1
# 阻止任何没有特权权限的线程修改数据
read_only=1

保存并退出,然后重启数据库,执行一下show master status,看到的结果应该和之前配置主库时差不多。

5.接下来,我们启动复制。

使用mysql 链接从库mysql。连接上之后执行如下SQL命令。

CHANGE MASTER TO MASTER_HOST='主库host地址',MASTER_USER='当时在主库建立的slave',MASTER_PASSWORD='建立slave账号时设置的pass',MASTER_LOG_FILE='在主库show master status 看到的mysql-bin.000001',MASTER_LOG_POS=在你备份数据时主库show master status看到的Position;

这里我执行上面的SQL命令后,报错:

ERROR 1201 (HY000): Could not initialize master info structure; more error messages can be found in the MariaDB error log

然后我执行了一下:

reset slave;

在执行上面的CHANGE命令,就可以了。

接着,我们执行一下下面的命令:

show slave status;

看到如下(这里省略了一些信息):可以看到其实还没有启动复制,因为从库的线程都还没有启动。

*************************** 1. row ***************************
           Slave_IO_State:
              ...
         Slave_IO_Running: No
        Slave_SQL_Running: No
          ...

然后我们执行一下:

start slave;
show slave status;

这回我们再看(省略了一些信息):相关线程已经启动起来啦。

    Slave_IO_State: Waiting for master to send event
              ...
         Slave_IO_Running: Yes
        Slave_SQL_Running: Yes
        ....

我们还可以在主库和从库上分别执行show processlist\G;来看下一,可以看到主库已经有线程在往slave发送binlog,从库上面也有线程在等待master发送binlog过来了。

主库:

*************************** 1. row ***************************
  Id: 234
User: root
Host: localhost
  db: NULL
 Command: Query
    Time: 0
   State: NULL
    Info: show processlist
Progress: 0.000
*************************** 2. row ***************************
      Id: 236
    User: slave
    Host: 47.94.5.239:54126
      db: NULL
 Command: Binlog Dump
    Time: 812
   State: Master has sent all binlog to slave; waiting for binlog to be updated
    Info: NULL
Progress: 0.000

从库:

*************************** 1. row ***************************
  Id: 6
User: root
Host: localhost
  db: NULL
 Command: Query
    Time: 0
   State: NULL
    Info: show processlist
Progress: 0.000
*************************** 2. row ***************************
      Id: 7
    User: system user
    Host:
      db: NULL
 Command: Connect
    Time: 768
   State: Waiting for master to send event
    Info: NULL
Progress: 0.000
*************************** 3. row ***************************
      Id: 8
    User: system user
    Host:
      db: NULL
 Command: Connect
    Time: 767
   State: Slave has read all relay log; waiting for the slave I/O thread to update it
    Info: NULL
Progress: 0.000

到这里,主从库就算配好了,接着我们来更新一条主库数据,看看从库会不会跟着更新。

在主库查看一条信息如下:

select * from myblog.users where id = 2;
+----+----------+----------------------------------+-------+-------+-------+------------+--------+----------+---------------------+---------------------+
| id | username | password                         | email | phone | intro | avatar_url | device | nickname | created_at          | updated_at          |
+----+----------+----------------------------------+-------+-------+-------+------------+--------+----------+---------------------+---------------------+
|  2 | wanghui  | 585b66ed3c06f4cadcb3084c0a621437 |       | 0     |       |            | pc     | 王慧     | 2018-05-17 15:04:22 | 2018-05-17 15:04:22 |
+----+----------+----------------------------------+-------+-------+-------+------------+--------+----------+---------------------+---------------------+
1 row in set (0.00 sec)

从库同样查看这条信息:

select * from myblog.users where id = 2;
+----+----------+----------------------------------+-------+-------+-------+------------+--------+----------+---------------------+---------------------+
| id | username | password                         | email | phone | intro | avatar_url | device | nickname | created_at          | updated_at          |
+----+----------+----------------------------------+-------+-------+-------+------------+--------+----------+---------------------+---------------------+
|  2 | wanghui  | 585b66ed3c06f4cadcb3084c0a621437 |       | 0     |       |            | pc     | 王慧     | 2018-05-17 15:04:22 | 2018-05-17 15:04:22 |
+----+----------+----------------------------------+-------+-------+-------+------------+--------+----------+---------------------+---------------------+
1 row in set (0.00 sec)

然后我们在主库进行更新:

MariaDB [(none)]> update myblog.users set nickname='测试更新' where id = 2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

然后我们来看一下从库是否有更新:

select * from myblog.users where id = 2;
+----+----------+----------------------------------+-------+-------+-------+------------+--------+--------------+---------------------+---------------------+
| id | username | password                         | email | phone | intro | avatar_url | device | nickname     | created_at          | updated_at          |
+----+----------+----------------------------------+-------+-------+-------+------------+--------+--------------+---------------------+---------------------+
|  2 | wanghui  | 585b66ed3c06f4cadcb3084c0a621437 |       | 0     |       |            | pc     | 测试更新     | 2018-05-17 15:04:22 | 2018-05-17 15:04:22 |
+----+----------+----------------------------------+-------+-------+-------+------------+--------+--------------+---------------------+---------------------+
1 row in set (0.01 sec)

到这里,看来主从配置已经大功告成啦!~

Copyright © 2017 - 2025 boboidea.com All Rights Reserved 波波创意软件工作室 版权所有 【转载请注明出处】

avatar

BoBo`s Blog每天进步一点点,能多一点是一点

基本信息
  • 姓名:bobo
  • 花名:胡巴
  • 性别:男
  • 血型:O型
  • 星座:白羊座

联系方式

  • 所在地:上海
  • QQ:279250819
  • 微信号:wanghuiwoshinideyou
  • 电子邮件:279250819@qq.com

博客地址

公众号

alt 无限递归

工作经历
  • 2022.5 - 至今

    • 公司:乐府互娱
    • 职位:高级SDK工程师
  • 2019.6 - 2022.4

    • 公司:萌推(上海突进网络科技有限公司)
    • 职位:中级PHP工程师 & 初级golang工程师
    • 荣誉:
      • 绩效A连续得主
      • 月度之星
      • 优秀个人奖
    • 所作所为:
      • 利用ES优化OMS、MMS管理系统商品列表查询
      • 利用消息队列、Redis、乐观锁优化商品审核流程
      • 利用Redis对商家端接口进行有效限流
      • 优化商品相关表索引,提升SQL查询速度
      • 商品中台构建,统一商品相关操作
      • 大表优化(数据分离、分表、大字段拆分)
      • 掌握所有商品核心流程
  • 2018.5 - 2019.5

    • 公司:DaDa英语(上海卓赞教育信息科技有限公司)
    • 职位:中级PHP开发工程师
    • 荣誉:无
    • 所作所为:
      • 利用ES优化教师CMS系统统计数据接口至500ms内
      • 工单系统开发及持续优化
      • 教师CMS系统的功能开发及持续优化
  • 2018.3 - 2018.5

    • 公司:波奇(上海)信息科技有限公司
    • 职位:初级PHP开发工程师
    • 荣誉:同下
    • 所做作为:如下
  • 2016.7 - 2018.3

    • 公司:光橙(上海)信息科技有限公司
    • 职位:初级PHP开发工程师
    • 荣誉:
      • 年度最佳进步奖
    • 所作所为:
      • 利用Redis提升商详接口最佳响应速度至50ms内
      • 利用Redis提升双11活动页可承受QPS至500以上
      • 利用Redis对接口进行简单限流
      • 与小伙伴合作提升搜索质量(ES初识)
      • 其他C端接口的开发及优化
      • B端商城老页面的维护及优化
SKILLS

编程语言

  • PHP
  • Golang
  • Shell
  • JAVA
  • JS
  • HTML\CSS

数据库

  • MySQL
  • Redis
  • Clickhouse

消息中间件

  • RabbitMq
  • Kafka

文档撰写

  • Swagger
  • Markdown

技术框架

  • Laravel
  • gin

搜索引擎

  • ElasticSearch

抓包工具

  • Charles