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每天进步一点点,能多一点是一点

appdata apt-get bloomfilter channel ChatGPT chsh Context css csv CUDA Cursor DaDa英语 Deepseek defer df docker elasticsearch error ffmpeg fix-missing form gif git GitLab globalproject golang HTTP HTTPS iconv IDE Interface iota Kafka LangChain libssl LLM ln mac mac系统更新 Map MCP MetaMCP mkdir MSYS2 mysql n8n nginx oh-my-zsh Ollama openconnect openssl PAM permission php pip PowerShell python rabbitmq redis reflect rsync SD sed shell Slice snowflake space SSH struct syntax_err tensorflow ubuntu ue4 unauthorized unreal4 UV vim virtualbox vpn VSCode Windows x86_64 xcode-select YCM zookeeper zsh 上海积分 主从复制 事务 二进制安全 交叉熵 人力资源 代码工具 代码编辑助手 代码评审 以太坊 信息论 全民哀悼 内存管理 内容创作 分屏 分支删除 区块链 匿名函数 协作系统 协议设计 启动盘 品种 图片转视频 均线 夏天 夏季 实用技巧 密码修改 工作流 工作流触发 工具 工具管理 开发工具 开发环境 循环 微信公众号 批处理 批量处理 批量替换 批量重命名 接收器 效率工具 教程 数据分析 数据合并 数据处理 数据类型 数据结构 数据聚合 数据转换 文件同步 文件管理 日志切分 智能体 智能合约 替代方案 本地部署 概率论 比特币 水果 治疗 流量分析 消息队列 版本控制 狗狗币 生活 用户行为 电视 症状 磁盘清理 笔记本技巧 编程语言 编译PHP 编辑器 网站统计 自动化 自动化工作流 自动提交 节点 获取方式 虚拟机 西瓜 记忆 购买指南 软连接 运维技巧 闭包 集成 雪花算法 面瘫 鞋子 项目无法编译
基本信息
  • 姓名: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