mysql学习

查看glibc版本

ldd --version

--mysql启动失败,尝试启动

1 查看错误日志,端口被占用,参数名写错,有不支持的参数

2 通过mysqld启动 mysqld --default-file=my.cnf &

3 mysqld --no-defaults --basedir=/user/local/mysql --datadir=/data/mysql/3306/data/ --user=mysql

4 strace查看mysql启动过程的系统调用情况

查看当前用户

select user();

系统表中注册已加载的组件

rpm包安装的软件默认加载了validate_password

show plugins;

SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS;

select * from mysql.component;

show variables like 'validate_password%';

加载validate_password

mysql5.7

install plugin validate_password soname 'validate_password.so';

vi /etc/my.cnf

plugin-load=validate_password.so

mysql8.0

install component 'file://component_validate_password';

--参数

--查看参数的信息

select * from variables_info limit 1 \G

default_authentication_plugin:默认的密码认证插件

master_info_repository:复制的相关信息保存在文件还是表里(mysql.slave_master_info,mysql.slave_relay_log_info)

gtid_mode=on

enforce_gtid_consistency=on

--错误

--mysql8.0以下的客户端连接mysql8.0报错

Authentication plugin 'caching_sha2_password' cannot be loaded

原因:mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password。

解决方法:

1 升级mysql客户端或驱动

2 将参数default_authentication_plugin设置为mysql_native_password

3 创建用户时指定auth_plugin为mysql_native_password

create user user1@'%' identified with mysql_native_password 'xxxxx';

创建用户不指定密码认证插件,实际上被默认指定

--主从复制

mysql8.0要加 get_master_public_key=1 ,主要是由于复制用户使用新的密码认证插件

change master to master_host='xxx', master_port=xxx, master_user='xxx', master_password='xxxx', get_master_public_key=1,master_log_file='binlog.000003',master_log_pos=155 for channel 'channel_201_3306';

基于gtid复制

change master to master_host='xxx', master_port=xxx, master_user='xxx', master_password='xxxx', master_auto_position=1;

--数据字典

mysql.slave_master_info 保存连接主库的信息,IO线程读取主库binlog信息(非实时,写入sync_master_info参数个事务后更新)

mysql.slave_relay_log_info sql线程重放relay_log的位置

--查看binlog事件

show binlog events in 'mysql-bin.000001';

--查看全局变量

show global variables like 'gtid_executed';

============================延迟复制============================

暂停SQL线程应用,并不会暂停IO线程接受日志

在主库执行后,要等待若干秒才在备库执行

===============使用场景:

1 应对主库的误操作,比如drop table

delete,update误操作,如果日志格式是ROW,可通过binlog闪回恢复.drop操作binlog只记录原生SQL,无法使用工具恢复

2 查看数据的历史状态

3 人为模拟主从延迟

也可使用flush tables with read lock模拟来模拟延迟

===============开启延迟复制

CHANGE MASTER TO master_host='xxxxx',master_port=xxxx,master_user='xxx',master_password='******',MASTER_LOG_FILE='mysql1_bin.000007', MASTER_LOG_POS=426114256 ,master_delay=28800;

stop slave;

CHANGE MASTER TO master_delay=28800;

start slave;

show slave status\G

SQL_Delay: 28800 ---期望的延迟时间

SQL_Remaining_Delay: 28774 ---需要等待多久才能到达期望延迟时间

Slave_SQL_Running_State: Waiting until MASTER_DELAY seconds after master executed event

===============使用延迟复制恢复主库误删的表

从库开启延迟复制

主库查看删表的binlog位置

show master status;

show binlog events in 'mysql-bin.000003';

pager grep -iB 5 drop

show binlog events in 'mysql-bin.000003';

从库恢复到drop之前的位点

stop slave;

CHANGE MASTER TO master_delay=0;

start slave until master_log_file='xxx',master_log_pos=xxx;

show slave status\G --确认恢复到指定位置

Master_Log_File=Relay_Master_Log_File

Exec_Master_Log_Pos=Until_Log_Pos

Slave_SQL_Running='No'

导出数据导入到主库

============================主从延迟============================

===============如何分析主从延迟

1 从库服务器的负载情况

top

iostat -xm 1

2 主从复制状态

show master status;

show slave status\G

对比主位点以及备读取位点

对比备读取位点以及备执行位点

3 主库binlog写入量

===============主从延迟常见原因以及解决方法

1 IO线程存在延迟

网络延迟 --开启slave_compressed_protocol,启用binlog压缩

磁盘IO存在瓶颈 --调整从库双1设置或者关闭binlog

网卡问题

2 sql线程存在延迟

a 主库binlog写入量过大,SQL线程单线程重放

具体体现:

从库磁盘IO无明显瓶颈

relay_master_log_file和exec_master_log_pos不断变化

binlog生成速度快于5分钟一个,主库写入量过大

解决:升级到5.7以上,开启并行复制

b statement格式下的慢SQL

具体体现:

relay_master_log_file和exec_master_log_pos一段时间没变化

解决:设置log_slow_slave_statements,记录从库的慢SQL,优化SQL

c 表上无索引且binlog为row格式

具体体现:

relay_master_log_file和exec_master_log_pos一段时间没变化

表无索引操作时,主库表只会被扫描一次,而row格式下的从库,对于每条记录都会扫描一次

解决

从库临时创建一个索引

将参数slave_rows_search_algorithms设置为INDEX_SCAN,HASH_SCAN

d 大事务

拆分成小事务

e 从库上有查询

消耗系统资源,有锁等待

查询操作阻塞主库的DDL

f 从库上有备份

全局读锁阻塞SQL线程

g 磁盘IO存在瓶颈

===============如何理解seconds_behind_master

根据计算逻辑

1 seconds_behind_master只计算SQL线程的延迟,不计算IO线程的延迟

网络原因,磁盘瓶颈,slave_net_timeout设置过大,导致的binlog未及时发送

2 binlog为statement和row计算逻辑不一样

3 级联复制无法真正反映延迟

主从延迟的监控

8.0之前使用pt-hearteat

8.0使用如下SQL

select case when min_commit_timestamp is null then 0

else unix_timestamp(now(6))-unix_timestamp(min_commit_timestamp) end as seconds_behind_master

from (select min(APPLYING_TRANSACTION_ORIGINAL_COMMIT_TIMESTAMP) as min_commit_timestamp

from performance_schema.replication_applier_status_by_worker

where applying_transaction<>'') t;

相关推荐
一 乐31 分钟前
考研论坛平台|考研论坛小程序系统|基于java和微信小程序的考研论坛平台小程序设计与实现(源码+数据库+文档)
java·数据库·学习·考研·微信·小程序·源码
William_Edmund1 小时前
C++ 算法学习——1.8 悬线法
学习
朝九晚五ฺ1 小时前
【Linux探索学习】第三弹——Linux的基础指令(下)——开启新篇章的大门
linux·运维·学习
肥or胖1 小时前
【MySQL】索引
linux·数据库·mysql
IM_DALLA1 小时前
【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL74
学习·fpga开发·verilog学习
王俊山IT2 小时前
C++学习笔记----8、掌握类与对象(五)---- 嵌套类与类中枚举
开发语言·c++·笔记·学习
读心悦2 小时前
修改 MySQL 数据库中的唯一键
数据库·mysql
卓琢2 小时前
(九)Shell 脚本(四):正则表达式、sed 和 awk 详解
linux·mysql·正则表达式
北极无雪2 小时前
Spring源码学习(拓展篇):SpringMVC中的异常处理
java·开发语言·数据库·学习·spring·servlet
问道飞鱼3 小时前
每日学习一个数据结构-默克尔树(Merkle Tree)
数据结构·学习·默克尔树