侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

ubuntu 16.04配置MySQL主从同步的配置方法

数据库  /  管理员 发布于 6年前   150

准备工作

1.主从数据库版本最好一致

2.主从数据库内数据保持一致

主数据库:121.199.27.227 /ubuntu 16.04 MySQL 5.7.21 ( 阿里云 )

从数据库:182.254.149.39 /ubuntu 16.04 MySQL 5.7.21 ( 腾讯云 )

防火墙配置

配置主服务器只允许特定 IP 访问数据库的端口,避免不必要的攻击。

主库防火墙配置

# iptables -A INPUT -p tcp -s slave_ip --dport 3306 -j ACCEPT#删除可能已经存在的配置,避免出现多条重复记录$ sudo iptables -D INPUT -p tcp -s 182.254.149.39 --dport 3306 -j ACCEPT $ sudo iptables -D INPUT -p tcp -s 127.0.0.1 --dport 3306 -j ACCEPT $ sudo iptables -D INPUT -p tcp --dport 3306 -j DROP $ sudo iptables -D INPUT -p udp --dport 3306 -j DROP $ sudo iptables -D INPUT -p sctp --dport 3306 -j DROP#增加配置,只允许特定地址访问数据库端口$ sudo iptables -A INPUT -p tcp -s 182.254.149.39 --dport 3306 -j ACCEPT$ sudo iptables -A INPUT -p tcp -s 127.0.0.1 --dport 3306 -j ACCEPT$ sudo iptables -A INPUT -p tcp --dport 3306 -j DROP$ sudo iptables -A INPUT -p udp --dport 3306 -j DROP$ sudo iptables -A INPUT -p sctp --dport 3306 -j DROP$ sudo iptables -L -n#保存配置$ sudo apt-get install iptables-persistent$ sudo netfilter-persistent save#配置被保存到/etc/iptables/rules.v4 /etc/iptables/rules.v6这两个文件下面,#最好确认一下实际保存的内容,尤其是安装了denyhosts等其他安全软件的情况下,#可能会记录了多余的规则,需要手工删除从库防火墙配置# iptables -A OUTPUT -p tcp -d master_ip --dport 3306 -j ACCEPT#删除可能已经存在的配置,避免出现多条重复记录$ sudo iptables -D OUTPUT -p tcp -d 121.199.27.227 --dport 3306 -j ACCEPT#增加配置$ sudo iptables -A OUTPUT -p tcp -d 121.199.27.227 --dport 3306 -j ACCEPT$ sudo iptables -L -n#保存配置$ sudo apt-get install iptables-persistent$ sudo netfilter-persistent save#配置被保存到/etc/iptables/rules.v4 /etc/iptables/rules.v6这两个文件下面,#最好确认一下实际保存的内容,尤其是安装了denyhosts等其他安全软件的情况下,#可能会记录了多余的规则,需要手工删除

主数据库master配置

1.修改mysql配置

$ sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

在[mysqld]部分进行如下修改:

[mysqld]log-bin = /var/log/mysql/mysql-bin.log #开启二进制日志,默认是注释掉的,我们去掉注释server-id = 1 #设置server-idbind-address = 0.0.0.0 #默认是127.0.0.1,此处我们设置为任意地址,放开远程访问,这么操作之前一定要确保防火墙配置正确,否则会产生安全风险

2.重启mysql,创建用于同步的用户账号

创建用户并授权:用户:repl 密码:slavepass

$ sudo service mysql restart$ mysql -u root -p -e "CREATE USER 'repl'@'182.254.149.39' IDENTIFIED BY 'slavepass';" #创建用户$ mysql -u root -p -e "GRANT REPLICATION SLAVE ON *.* TO 'repl'@'182.254.149.39';" #分配权限$ mysql -u root -p -e "flush privileges;" #刷新权限

3.查看master状态,记录二进制文件名(mysql-bin.000001)和位置(333802):

$ mysql -u root -p -e "SHOW MASTER STATUS;"Enter password: +------------------+----------+--------------+------------------+-------------------+| File       | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+----------+--------------+------------------+-------------------+| mysql-bin.000001 |  333802 |       |         |          |+------------------+----------+--------------+------------------+-------------------+

4.主库备份,为从库的第一次数据同步准备数据

使用如下脚本产生数据库备份文件

#此处以备份wordpress数据库为例子datadump=`which mysqldump`mysqluser="root"userpass="password" wordpressdb="wordpress"backupwordpress_sql=$wordpressdb.`date +%Y%m%d`.sqlif $datadump -u $mysqluser --password=$userpass -h localhost --opt $wordpressdb > $backupwordpress_sql 2>&1then  echo " backup $wordpressdb success"else  echo " backup $wordpressdb error"  exit 1fi#检验文件尾部是否存在 “-- Dump completed on”,如果存在不存在,则说明备份出错了。if [ 0 -eq "$(sed '/^$/!h;$!d;g' $backupwordpress_sql | grep -c "Dump completed on")" ]; then echo " backup $wordpressdb error" exit 1 else echo " backup $wordpressdb success"fi

执行脚本,确保最后输出备份成功

$ cd ~$ sudo bash backup_wordpress.sh

从服务器slave配置

1.修改mysql配置

$ sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

修改server-id,每个数据库的server-id要求是唯一的,不能相互冲突

[mysqld]server-id = 2 #设置server-id,必须唯一log_bin         = /var/log/mysql/mysql-bin.log #日志也最好打开

2.首次还原数据库:

$ sudo service mysql restart$ scp -P 22 -r [email protected]:~/wordpress.*.sql ./#删除可能存在的一行警告信息,这行警告信息可能导致我们无法恢复数据$ sed -i "/^mysqldump: \[Warning\] Using a password on the command line interface can be insecure\./d" wordpress.*.sql$ mysql -u root -p -e "drop database wordpress;"$ mysql -u root -p -e "create database wordpress;"$ mysql -u root -p wordpress < wordpress.*.sql

3.重启mysql,打开mysql会话,执行同步SQL语句(需要主服务器主机名,登陆凭据,二进制文件的名称和位置):

$ mysql -u root -p -e "CHANGE MASTER TO MASTER_HOST='121.199.27.227', MASTER_USER='repl', MASTER_PASSWORD='slavepass', MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=333802;"

4.启动slave同步进程:

$ mysql -u root -p -e "start slave;"

5.查看slave状态:

$ mysql -u root -p -e "show slave status\G;"Enter password:*************************** 1. row ***************************        Slave_IO_State: Waiting for master to send event         Master_Host: 121.199.27.227         Master_User: repl         Master_Port: 3306        Connect_Retry: 60       Master_Log_File: mysql-bin.000001     Read_Master_Log_Pos: 9448236        Relay_Log_File: VM-114-251-ubuntu-relay-bin.000002        Relay_Log_Pos: 17780    Relay_Master_Log_File: mysql-bin.000001       Slave_IO_Running: Yes      Slave_SQL_Running: No       Replicate_Do_DB:     Replicate_Ignore_DB:      Replicate_Do_Table:    Replicate_Ignore_Table:   Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table:    ...

当Slave_IO_Running和Slave_SQL_Running都为YES的时候就表示主从同步设置成功了。接下来就可以进行一些验证了,比如在主master数据库的test数据库的一张表中插入一条数据,在slave的test库的相同数据表中查看是否有新增的数据即可验证主从复制功能是否有效,还可以关闭slave(mysql>stop slave;),然后再修改master,看slave是否也相应修改(停止slave后,master的修改不会同步到slave),就可以完成主从复制功能的验证了。

还可以用到的其他相关参数:

master开启二进制日志后默认记录所有库所有表的操作,可以通过配置来指定只记录指定的数据库甚至指定的表的操作,具体在mysql配置文件的[mysqld]可添加修改如下选项:

# 不同步哪些数据库 binlog-ignore-db = mysql binlog-ignore-db = test binlog-ignore-db = information_schema # 只同步哪些数据库,除此之外,其他不同步 binlog-do-db = game

如之前查看master状态时就可以看到只记录了test库,忽略了manual和mysql库。

总结

以上所述是小编给大家介绍的ubuntu 16.04配置MySQL主从同步的配置方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对站的支持!


  • 上一条:
    完美解决mysql in条件语句只读取一条信息问题的2种方案
    下一条:
    Mysql中通过生日计算年龄的多种方法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 分库分表的目的、优缺点及具体实现方式介绍(0个评论)
    • DevDB - 在 VS 代码中直接访问数据库(0个评论)
    • 在ubuntu系统中实现mysql数据存储目录迁移流程步骤(0个评论)
    • 在mysql中使用存储过程批量新增测试数据流程步骤(0个评论)
    • php+mysql数据库批量根据条件快速更新、连表更新sql实现(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-06
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-01
    • 2018-05
    • 2018-10
    • 2018-11
    • 2020-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2021-02
    • 2021-04
    • 2021-07
    • 2021-08
    • 2021-11
    • 2021-12
    • 2022-02
    • 2022-03
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-07
    • 2023-08
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客