MySQL DBA 工作笔记
1 DDL
1.online DDL 3种方式:
copy,会创建临时表,并记录增量。
inplace,不创建临时表,对当前的数据文件进行修改
defaul,根据参数old_alter_table判断,默认是OFF,表示采用inplace
2.pt-osc 常用
2 GTID
select * from gtid_executed; <-- set @@global.gtid_purged='gtid事务段';
show variables like '%purge%';
`如果发生异常:对比主库事务号,找到临界点,从库进行purged,重建复制。
3 主从数据同步
pt-table-checksum + pt-table-sync
4 MHA
(1)、 Manager工具:
– masterha_check_ssh : 检查MHA的SSH配置。
– masterha_check_repl : 检查MySQL复制。
– masterha_manager : 启动MHA。
– masterha_check_status : 检测当前MHA运行状态。
– masterha_master_monitor : 监测master是否宕机。
– masterha_master_switch : 控制故障转移(自动或手动)。
– masterha_conf_host : 添加或删除配置的server信息。
(2)、 Node工具(这些工具通常由MHAManager的脚本触发,无需人手操作)。
– save_binary_logs : 保存和复制master的二进制日志。
– apply_diff_relay_logs : 识别差异的中继日志事件并应用于其它slave。
– filter_mysqlbinlog : 去除不必要的ROLLBACK事件(MHA已不再使用这个工具)。
– purge_relay_logs : 清除中继日志(不会阻塞SQL线程)。
(3)、自定义扩展:
-secondary_check_script:通过多条网络路由检测master的可用性;
-master_ip_failover_script:更新application使用的masterip;#重点
-shutdown_script:强制关闭master节点;
-report_script:发送报告;
-init_conf_load_script:加载初始配置参数;
-master_ip_online_change-script:更新master节点ip地址;#重点
`逻辑:
masterha_manager:masterMonitor (包含心跳检测 wait_until_master_is_dead) + MasterFailover
masterha_master_switch会调用MasterFailover和masterRotat:查看最新的slave,补齐日志(通过mysqlbinlog基于时间戳来处理)
备注:
1.Favilover 在8小时内再次切换,会报错。
2.主从复制的检查阈值,基于second_behind_master 默认30s.# 30秒以上的主从延迟是无法启动MHA的。
3.健康检查,ping_type:ping insert,ping select,ping connect # 建议设置为ping insert.(在表插入一条记录,来验证MHA的可用性)
5 InnoDB Cluster
#share nothing 的特点。强一致性+组播
MySQL Shell,MySQL Router,MGR
>Python最低要求是2.7
>MySQL5.7.17,推荐8.0.22以上
1.
测试环境:
使用MySQL Shell的命令mysqlsh开始部署,创建一个端口为3310的实例
mysql-js> dba.deploySandboxInstance(3310)
接着创建另外两个节点 3320,3330
dba.deploySandboxInstance(3320)
dba.deploySandboxInstance(3330)
我们切换到3310的MySQL实例,准备开始创建Cluster
mysql-js> \connect root@localhost:3310
`至少需要3个节点,最多9个
mysql-js> var cluster = dba.createCluster('testCluster')
接着把另外两个节点加入进来,先加入端口为3320的节点
mysql-js> cluster.addInstance('root@localhost:3320')
加入端口为3330的节点,日志和节点2相似。
mysql-js> cluster.addInstance('root@localhost:3330')
这个时候Cluster就创建好了。
2.
配置一下MySQL Router,创建个软链接,保证能够正常调用。
# ln -s /home/innodb_cluster/mysql-router-2.1.3-linux-glibc2.12-x86-64bit/bin/mysqlrouter /usr/bin/mysqlroute
# which mysqlroute
/usr/bin/mysqlroute
配置MySQL Router的启动节点为端口3310的实例
# mysqlrouter --bootstrap root@localhost:3310 --user=mysql
这个时候还是要输入密码,成功之后,这个绑定就打通了。
可以从上面的日志看出来,分配的读写端口是6446,只读端口是6447,还有x协议连接的端口为64460,64470
启动MySQL Router
# mysqlrouter & #也可以 -c 自定义启动加载的配置文件
如果对MySQL Router还有些疑问,可以看看安装目录下,会生成下面的配置文件,我们就看里面的.conf文件,里面的一部分内容如下:
[routing:testCluster_default_rw]
bind_address=0.0.0.0
bind_port=6446
destinations=metadata-cache://testCluster/default?role=PRIMARY
mode=read-write
protocol=classic
我们尝试使用6446来连接登录,这个时候就通过MySQL Shell开启了连接入口,MySQL Router做了转接,连接到了里面的读写节点3310
# mysqlsh --uri root@localhost:6446
mysql-js> \sql
Switching to SQL mode... Commands end with ;
mysql-sql> select @@port;
+--------+
| @@port |
+--------+
| 3310 |
+--------+
如果切换为脚本模式查看实例的状态,可以使用里面定义的API来做,输出都是JSON串。
mysql-js> dba.configureLocalInstance('root@127.0.0.1:3310')
如果查看Cluster的信息,可以看到下面的读写节点,只读节点的状态信息
mysql-js> dba.getCluster()
`得到Cluster的信息:
mysql-js> cluster.status()
3.验证
模拟一个节点出现问题,可以使用killSandboxInstance方法。
mysql-js> dba.killSandboxInstance(3310)
节点被清理了,没有任何进程存在。
# ps -ef|grep mysql|grep 3310
使用6446的端口来统一连接,这个时候就切换到了端口3320的MySQL服务
# mysqlsh --uri root@localhost:6446
mysql-js> \sql
Switching to SQL mode... Commands end with ;
mysql-sql> select @@port;
+--------+
| @@port |
+--------+
| 3320 |
+--------+
所以切换的部分没有问题,我们再次把“迷失”的节点启动起来。
# mysqlsh --uri root@localhost:6446
mysql-js> dba.startSandboxInstance(3310)
这个时候再次查看Cluster的状态,3320就是主了,3310就是只读节点了。
mysql-js> dba.getCluster()
`把节点2纳入到Cluster中
mysql-js> cluster.rejoinInstance('root@localhost:3310')
6 MyCAT
例如 4个物理节点,每个节点4个逻辑库(点),共16个sharding分片
对应schema.xml 16个datanode dn* 16个database 库名*
`DDL:Mycat端不支持,需要到每个节点单独执行
## 6 MyCAT
```shell
例如 4个物理节点,每个节点4个逻辑库(点),共16个sharding分片
对应schema.xml 16个datanode dn* 16个database 库名*
`DDL:Mycat端不支持,需要到每个节点单独执行
—From 杨建荣著