了解昨天提到的主从运作流程後,今天来实际搭建主从架构~
在前面我们起了一台VM当作Master,现在在新增一台VM当作Slave,让Slave能够连接到Master完成主从复制功能。 ps.参考Day.3 部署流程
跳过Slave部署mysql流程. . .
1.确认Master配置有开启binlog设定 (设定档: /etc/mysql/my.cnf)
[mysqld]
#确保与要连线的slave ID不同(唯一)
server-id = 1
#binlog(ON)&设定档名以mysql-bin开头
log-bin = mysql-bin <- (确认有设定)
#binlog的格式(模式:row/statement/mixed)
binlog-format = row
#保留x天binlog (default:0,表示不自动删除)
expire_logs_days = 1
#写缓冲x次,刷一次磁碟(0:预设系统每隔一段时间重整快取资料到磁碟,1:每次事务提交就会写入磁碟,N:每N个事务提交...)
sync-binlog = 1
...
mysql> CREATE USER 'replicate'@'%' IDENTIFIED BY '1234';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replicate'@'%';
mysql> FLUSH PRIVILEGES;
root@mysql-master-1:/mnt/mysql_data/mysql# mysqldump -uroot -p1234 --routines --events --single-transaction --master-data=2 --flush-logs --all-databases >
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
[client]
#mysql 客户端连线服务端预设port
port=3306
socket=/mnt/mysql_data/mysql/mysql.sock
[mysqld]
#mysql使用socket方式登陆的sock档案路径
socket=/mnt/mysql_data/mysql/mysql.sock
#mysql 资料库档案所在目录
datadir=/mnt/mysql_data/mysql
#错误日志路径
log-error=/var/log/mysql/error.log
#mysql服务端预设监听port
port=3306
# 设定字符集utf8
character_set_server=utf8
#slow log是否开启(1启用/0禁用)
slow-query-log = 1
#慢查询日志路径&档名
slow_query_log_file=/mnt/mysql_data/mysql/slow.log
#执行超过x秒就纪录 (EX: 1s)
long_query_time = 1
#服务器ID,注意要与master的server_id不同(唯一)
server-id = 2
#relay_log 配置中继日志
relay-log=/mnt/mysql_data/mysql/slave1-relay-bin
#只读状态
read_only = 1
#====slave crash-safe====
#master.info和relay-log.info内容写入DB:mysql中的表
master_info_repository = TABLE
relay_log_info_repository = TABLE
#意外时重启後会忽略未被执行的relay log,重新连接master获取relay log来进行恢复
relay-log-recovery = 1
...
root@mysql-slave-1:/mnt/mysql_data/mysql# systemctl restart mysql
mysql> change master to master_host='10.128.0.4',master_user='replicate',master_password='1234',master_log_file='mysql-bin.000004',master_log_pos=154;
mysql> start slave;
最後确认一下状态是否成功连接就完工啦
如果主从有同步异常停止时,会造成读取资料不一致,影响业务上运作。
所以如何快速第一时间检视问题点 ?
1.透过show slave status 浏览状态
2.错误日志
ex.假设今天先在slave删掉了一笔纪录。那当我在master执行删除同一笔资料,语法同步至slave时会产生该笔资料不存在的问题,等於SQL-thread提取的日志无法应用在slave上会喷下图1032错误,造成同步失败停止。因为对於slave来说该笔资料早就被删除了!!
以上面例子来说可以看到错误提示为在Master-(mysql-bin.000004, end_log_pos 1010)位置的DELETE事件错误,由於在slave上要执行删除的资料已经不存在,所以在这边我们可以透过还原被删除的资料,逆向手动执行INSERT那笔要被删除的资料让DELETE语法能顺利执行。
首先在master上透过错误提示位置找到该event纪录的详细栏位资讯用来还原该笔资料。
在slave上执行还原插入资料後重启复制线程
mysql> insert into user.user_powers(user_id,nick_name,group_id) values(23122141,'kiki',1242000);
mysql> start slave;
以上算是针对该问题安全解决的做法。但有时看情况也可选择直接跳过该错误Event,如果不会影响到资料的一制性(ex.本例)
mysql> stop slave;
#代表跳过这1个event
mysql> SET GLOBAL sql_slave_skip_counter = 1;
mysql> start slave;
提供2种方式没问题的话就可以看到Slave_SQL_Running状态恢复成YES正常运作啦~
<<: Day 20 「就是真诚」TDD 的实弹演习:Magneto Effect
今天要来说到在APP中加入Google map,以下概略的介绍一些建置与功能用法,首先,我们要来新增...
崩溃之後面对的是迟钝 上一章我们解决了网页崩溃问题,接下来发现网页中的动画在电脑上顺利执行,IPho...
前言 各位早安,书接上回我们已经成功抓到网页的原始码了,今天我们要把它变成有用能阅读的资讯 开爬-网...
表单在网页上有不同呈现的功能,像是网路投票、注册、购物、问券、搜寻等,用来收集浏览者的资讯,增加与使...
写在前面 test for placeholder test for placeholder tes...