ubuntu 16.04配置MySQL主从同步的配置方法
准备工作
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-id bind-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`.sql if $datadump -u $mysqluser --password=$userpass -h localhost --opt $wordpressdb > $backupwordpress_sql 2>&1 then echo " backup $wordpressdb success" else echo " backup $wordpressdb error" exit 1 fi #检验文件尾部是否存在 “-- 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 root@121.199.27.227:~/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主从同步的配置方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
- 如何使用Feign构造多参数的请求
- 最简日志打印规范
- 碎片化 | 第四阶段-47-值栈细节问题-视频
- word2vec 模型思想和代码实现
- 碎片化 | 第四阶段-48-hibernate概述和配置-视频
- 【LEETCODE】模拟面试-357- Count Numbers with Unique Digits
- Python 爬虫 2 爬取多页网页
- 碎片化 | 第四阶段-49-hibernate之HQL查询操作-视频
- Spring Cloud各组件超时总结
- 总结Web应用中常用的各种Cache
- 碎片化 | 第四阶段-50-hibernate之Criteria和NavtiveSQL查询操作-视频
- kafka_2.11-0.11.0.1集群搭建
- Spring Cloud Edgware新特性之五:filters端点
- 碎片化 | 第四阶段-51-Hibernate注解使用-视频
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- springmvc之如何对表单数据进行校验
- 基于TypeScript封装Axios笔记(七)
- 2015年javaB组1-4题解析与理解
- 【matplotlib】绘制散点图
- LeetCode刷题心得 -- map的妙用
- 2015javaB组第五题表格计算
- 【线性回归】读取txt
- 走近STL - Vector,再次见面
- 【线性回归】标准方程法
- 133: error: in C++98 XXX must be initialized by constructor, not by '{...}'
- spring之如何将验证错误信息显示在相应界面
- 【python-leetcode329-深度优先搜索】矩阵中的最长递增路径
- 带权树 -- 哈夫曼树,与它的那张哈夫曼编码表
- 【python-动态规划】0-1背包问题
- python之列表推导和生成器表达式