
MySQL
日常遇到的MySQL问题,以及MySQL学习心得
渔不是鱼
心向往之,行必能至!
展开
-
【Percona-Toolkit】系列之pt-table-checksum和pt-table-sync 数据校验修复神器
这次主要包含两个工具,都可以在percona-tookit里面找到pt-table-sync实际操作操作的时候会有压力?可以看到我在线上操作的时候数据库基本没有任何压力。该工具并不会对数据库产生任何性能影响。...原创 2022-06-21 22:00:00 · 618 阅读 · 0 评论 -
【Percona-Toolkit】系列之pt-duplicate-key-checker索引check神器
工具简介pt-duplicate-key-checkerUsage:1.检查数据库表中重复/多余索引或者外键常用参数--key-types=s 校验的类型,f=foreign keys, k=keys or fk=前面两种都check,默认两种都check--ignore-order 忽略索引的顺序, KEY(a,b) 不同于 KEY(b,a)--all-structs btree hash索引都进行比较--verboses 打印所有索引使用示例使用表结构如下:&原创 2022-05-04 22:30:00 · 559 阅读 · 1 评论 -
【MySQL】数据库压测神器之sysbench
写在开头说起数据库的性能,我们一般都会说到这个数据库处理读写的能力怎么样,以及磁盘会有SSD和HDD的区别,以及数据库的类型,关系还是内存等等多个分类,但是对于我们来说如果要去熟悉一个新的数据库来说,肯定得先知道这个数据库的性能,不管哪个数据库,都离不开一个非常重要的part----压测,而且数据库的使用程度也会和这个part非常息息相关,所以这次和大家介绍一个数据库性能压测工具—sysbenchsysbench 简介sysbench是一个模块化的,跨平台的,多线程基准测试工具,主要用于评估测试各种不原创 2022-05-03 22:30:00 · 2646 阅读 · 1 评论 -
【Percona-Toolkit】系列之pt-diskstats磁盘性能分析神器
工具简介`pt-diskstats`usage: pt-diskstats [OPTIONS] [FILES]1.输出系统磁盘相关的信息。有点类似于`iostat`命令,不过它比`iostat`输出的更加详细一点官方文档:https://www.percona.com/doc/percona-toolkit/LATEST/pt-diskstats.html常用参数--iterations=i 输出多少次示例--interval=i 每次输出示例间隔多少s--devices-reg原创 2022-03-19 20:59:26 · 678 阅读 · 1 评论 -
【Percona-Toolkit】系列之pt-deadlock-logger死锁检测管理神器
背景相信死锁deadlock这个词语对DBA,还是开发来说都是听不愿意面对,因为往往死锁会导致数据库产生一些性能问题,而且锁这个东西,在数据库中是一种比较昂贵的资源,一旦死锁,不管是DBA还是开发出来这些东西都非常头疼。虽然对于MySQL来说,我们可以通过show engine innodb status\G看到最近一次的deadlock信息,也可以通过打开innodb_print_all_deadlocks将所有的deadlock信息输出到数据库的error log中,但是有一些弊端:show e原创 2022-03-19 19:53:56 · 1367 阅读 · 1 评论 -
【Percona-Toolkit】系列之pt-config-diff配置文件对比差异神器
背景相信做DBA的朋友都有遇到过问题,随着管理运维的集群数量变多,再加上有的时候会动态去优化部分参数,可能会导致MySQL配置文件内容不一致,针对这个问题,我们今天的主角pt-config-diff,可以很方便的帮大家去解决这个问题。工具简介...原创 2022-03-19 16:23:35 · 1744 阅读 · 0 评论 -
【Percona-Toolkit】系列之pt-archiver数据归档清理神器
题外话时隔半年,我终于又回来开始写percona-tookit系列了,之前有点忙,也有点偷懒,这次一定认真写下去。好不废话上今天的主角pt-archiver工具简介pt-archiverusage:1.归档A库数据到B库做备份2.安全删除数据,不影响数据库性能,(但是不会回收碎片空)3.导出数据文件,方便load data回去4.合并数据常用参数--no-delete 同步不删除原数据--purge 删除数据--progress=i 每操作多少行输出一次处理信息原创 2022-03-16 22:42:39 · 1576 阅读 · 2 评论 -
【MySQL】用logrotate归档MySQL日志
背景前面说过因为vim大文件导致的OOM,所以后续优化方案里面写了要对MySQL的日志进行归档操作。经过调研,一般两种方案实现:1使用脚本crontab去清理备份归档2使用logrotate配置进行去清理归档我这里主要介绍第二种方案,因为比较通用,可以清理各种日志logrotate简介logrotate是专门用来归档处理各种服务产生的日志具有以下特点: 1. 支持对日志自动进行归档压缩 2. 支持对日志进行按天或者按周,月年等多维度进行归档 3. 可以设置保留的时间,根据个数实现 4原创 2022-03-16 18:03:50 · 2018 阅读 · 1 评论 -
【MySQL】vim引发的MySQL进程挂掉
背景上周一个业务排查处理死锁的时候的时候,先tail -n200 mysql-error.log,处理过死锁的小伙伴都知道,show engine innodb status\G只能看到最近一次的死锁信息,而对于历史的死锁信息需要开启innodb_print_all_deadlocks_output这个参数,一旦数据库开启了这个参数,就会将所有的历史死锁信息输出到MySQL的error log。而一条死锁如果锁定的行数或者记录很多的话,一条死锁记录可能就会几百行,所以当时一直看不到想要的信息,就原创 2022-03-15 22:33:43 · 1131 阅读 · 0 评论 -
【MySQL】删除数据备份数据脚本
# -- coding:UTF-8 --import os, time, re, sys, io, randomimport pymysqlAccountFile = '/data1/DataClean/th/account_th_3.del'db_host = 'localhost'db_port = 6606db_database = ''db_user = ''db_pass = ""DelTable = ''def get_conn(): try:原创 2022-03-14 21:41:40 · 1049 阅读 · 1 评论 -
【MySQL】数据库开发规范
背景之前也做了好多次数据库开发规范培训,也是时候整理一下自己写的开发规范。开发规范1.数据库命名规范数据库对象(库名、表名、列名等)必须使用小写字母,必要时候使用下划线分割数据库对象禁止使用mysql 关键字和保留关键字数据库对象中存储相关数据的列名和列类型必须一致,例如 玩家 id相关列 在各个表中列名和类型 bigint 均须一致数据库对象名称须见名知意,且长度限制在12个字符内数据库字段名表名尽量对重要字段带comment标识索引名带上标识,唯一索引uk_,普通索引idx_2原创 2022-02-28 18:51:17 · 2720 阅读 · 9 评论 -
【MySQL】MySQL锁监控状态值异常
背景最近在忙着定制线上的监控,在忙到锁这里的时候,发现了一个奇怪的现象:现象如下:可以看到当前有很多锁等待(然后连续好几天观测都是2239),没有变化[(none)]>show global status like 'Innodb_row_lock%';+-------------------------------+-------------+| Variable_name | Value |+------------------------原创 2022-02-28 21:30:00 · 881 阅读 · 1 评论 -
【MySQL】不影响IO安全删除大表脚本
#!/bin/bashdb_path="数据库路径"db_user=''db_pass=''db_host=''db_name=''TruncateFile(){ file_name=$1 del_speed=10485760 file_size=$(/usr/bin/stat -c%s "$file_name") if [[ -f /usr/bin/truncate ]];then for del_size in `seq $file_size -${del_sp原创 2022-02-25 17:42:56 · 3434 阅读 · 0 评论 -
【MySQL】在线无锁无延迟DDL神器gh-ost
工具简介gh-ost是一款在线无锁的DDL神器,支持在主库,或者从库两种模式使用,而且还可以根据系统的负载延迟来动态暂停启动DDL工作,避免主从延迟等问题的出现。官方地址:gh-ost官网工作原理gh-ost使用二进制日志流捕获表更改,并异步应用到幽灵表上,最后交换幽灵表和原表。执行DDL的过程可分为三个阶段: 1. `校验`:是否有主键、外键、触发器;gh-ost连接的是主库还是从库,从库是否开启log_slave_updates;是否已经存在gho和del结尾的临时表等。 2. `迁移原创 2022-02-25 17:40:22 · 1490 阅读 · 2 评论 -
【MySQL】MySQL监控项整理
浅谈监控对于DBA来说,数据库的监控也是一个非常重要的点,因为好的监控不仅方便我们快速定位问题,节约时间。但是一些监控系统自带的监控模版,往往会有很多个监控Metrics,所以定制数据库监控对于DBA来说是非常重要的一件事,也是必须花时间去做的事情。监控项下面是我最近整理出来的MySQL整体的监控图,具体采集的指标打开可以自己去寻找,这里我只提供一下思路。下面这些基本都能从MySQL 的status里面找到。分为5个方面#1.系统方面CPU内存磁盘IO网络LOAD 1 5 15系原创 2022-02-25 16:58:31 · 754 阅读 · 0 评论 -
【MySQL】排查锁相关问题方法
前言相信不管是做DBA还是开发,大家其实都不想遇到锁这玩意儿,因为锁这东西是一把双刃剑,用的好了的话可以保护对资源的并发访问竞争,但是用不好的话,很容易引起线上问题,比如死锁,锁等待,业务等待,业务不可用,数据库性能急剧下降。MySQL锁相关表相信大家都知道,MySQL锁的种类有很多种,读锁写锁元数据锁等等。进入正题我们如何排查锁,一般通过以下几张表:5.7版本 Information_schema.innodb_locks表会显示当前的等待的锁 Information_schema.inno原创 2022-02-21 16:20:01 · 843 阅读 · 0 评论 -
【快速创建MySQL单机和集群测试环境工具】dbdeployer
原创 2022-02-21 16:09:58 · 786 阅读 · 2 评论 -
【MySQL】数据误删快速恢复工具----binlog2sql
1.简介从MySQL binlog解析出你要的SQL。根据不同选项,你可以得到原始SQL、回滚SQL、去除主键的INSERT SQL等官方文档: https://github.com/danfengcao/binlog2sql2.用途数据快速回滚(闪回)主从切换后新master丢数据的修复从binlog生成标准SQL,带来的衍生功能3.适用环境Python 2.7, 3.4+MySQL 5.6, 5.74.安装git clone https://github.com/danfeng原创 2022-02-17 17:55:56 · 1566 阅读 · 0 评论 -
【MySQL】深入了解Innodb_buffer_pool
1.何为innodb_buffer_poolinnodb_buffer_pool我们俗称缓冲池,缓冲池简单来说就是一块内存区域,通过内存的速度来弥补磁盘速度较慢对数据库性能的影响。写入时,先将数据写入缓冲池种,再定期刷新到磁盘;读取时,将读到的页放到缓冲池种,下次再读取相同的页时,会首先判断该页是否在缓冲池中,若在缓冲池中则直接从缓冲池中返回。2.innodb_buffer_pool的组成及工作原理2.1 innodb_buffer_pool的组成2.2 innodb_buffer_pool的原创 2022-02-17 17:15:48 · 1539 阅读 · 0 评论 -
【MySQL启动报错一例】InnoDB: Failed to create check sector file, errno:13
报错信息今天遇到一个5.7MySQL安装的报错信息,报错信息如下:[ERROR] InnoDB: Failed to create check sector file, errno:13 Please confirm O_DIRECT is supported and remove the file /data1/check_sector_size if it exists.虽然不影响使用,但是每次启动的时候都有Error报错,总觉得可能在某方面会有问题。解决方案经过查阅搜索,发现其实是MySQL原创 2022-02-16 16:39:36 · 2638 阅读 · 0 评论 -
【MySQL change master 报错】 Slave is not configured or failed to initialize properly
问题背景今天数据库主库异常重启,导致数据丢失,所以在5.5版本(历史遗留问题)的MySQL主库上重新做了一份新的备份,还原到从库(从库是5.7的版本),还原非常成功,但是在搭建主从关系的时候,发生了如下报错:ERROR 1794 (HY000): Slave is not configured or failed to initialize properly. You must at least set --server-id to enable either a master or a slave原创 2022-02-14 20:13:12 · 2530 阅读 · 1 评论 -
MySQL统计信息不准确导致索引失效
1.统计信息不准确的影响统计信息不准确一般会导致MySQL优化器无法选择正确的索引,从而导致优化器选择错误的索引或者不走索引,引起索引失效,导致大量慢查询。2.什么情况下会导致统计信息不准确?一般来说,大体分为以下两种情况:统计信息未及时更新,不正确的统计信息导致索引失效。表中碎片过多,导致Cardinality不准确,计算错误。下面就两种场景进行细谈:统计信息未及时更新在这个话题之前先看一些参数:FOR MySQL 5.7:一般来说统计信息由下面的参数控制:innodb_stat原创 2021-12-02 12:12:05 · 2663 阅读 · 0 评论 -
MySQL Gtid_executed和Gtid_purged修改时机
背景对于GTID复制,如果存在多个机器的GTID的时候,说明这个机器之前是很多机器的从库,但是GTID没有清理,之前对GTID的一些变量知道含义,但是具体的修改时机,以及执行的命令会有什么作用没有理解。先介绍一下变量:Gtid_executed:当前机器已经执行过的GTID事务号。Gtid_purged:当前机器已经清理的GTID号。理解起来很简单,但是操作起来就比较容易不理解了。比如这两个变量可以直接修改吗,reset master会有什么影响吗?带着这些问题我做了一些测试。测试过程原创 2021-09-26 17:50:30 · 1340 阅读 · 0 评论 -
MySQL源码之--Table_cache
一.table_cache 相关参数1.open_files_limit2.max_connections3.table_open_cache4.table_definition_cache问题?经常会看到自己my.cnf设置的那四个值和在MySQL中看到的值不一样.我修改了其中一个参数,结构发现所有的上面的四个参数都发生了变化。参数到底应该设置为多少合适?二.源码分析之初始化1.常量定义源码位置:/sql/sql_const.h#define TABLE_OPEN_CACHE_MI原创 2021-09-23 18:47:44 · 449 阅读 · 0 评论 -
MySQL- table cache最详细笔记
参数:table_open_cache文件句柄,描述符fd,table_definition_cache元数据,.frm文件,初始化的时候加载一次。状态值:Open_tables。 当前打开表的数量,可以通过命令show open tables查看。第一次开始会缓存系统表.Opened_tables 通过my_open()函数打开的表数量Open_table_definitions 当前打开表的定义数量,缓存.frm文件Opened_table_definitions。打开表的定义的总原创 2021-09-23 12:12:11 · 1101 阅读 · 0 评论 -
一条SQL走错索引导致数据库出现超时问题排查过程
现象最近刚接手的一个项目,在某天中午12点30多分接到开发反馈,他们业务请求数据库的时候,出现了大量请求超时问题,虽然之前也有过,但是这次持续很久,大概两分钟多又恢复好了。数据库版本8.0.22。初步分析接到问题,不着急,先看一下监控:从监控图上看可以看到在对应的12点36分左右的时候出现了连接数开始飙高,以及这个点出现了少量的慢sql.查看的对应时间点的慢查询日志,查到对应时刻有如下的慢查询sql:在这里插入代码片...原创 2021-09-14 17:32:34 · 434 阅读 · 0 评论 -
MySQL源码之innodb_io_capacity
背景这段时间公司新来了一个校招的小姐姐,来了之后一直在熟悉压测相关的,经过了一段时间的压测,今天给我们做了一个分享,讲的确实挺好,挺全面,参数啊结果都讲的挺不错的,但是,问题他这就来了:在展示压测关于innodb_io_capacity参数值压测的时候,我人呆住了,不论innodb_io_capacity的值变化多少,相同线程数量下,qps都是几乎完全相同的。??????这就是我脑子当时的反应没有任何变化,这一下子让我觉得不太可能,有问题简单了解之后,压测的那台机器上数据库buffer_po原创 2021-08-14 10:48:12 · 1729 阅读 · 0 评论 -
MySQL报错:ERROR 3546 (HY000): @@GLOBAL.GTID_PURGED cannot be changed: the new value must be a superset
解决方案今天在set gtid的时候报了下面的错误:sql>set global gtid_purged="dd3ce11f-30f4-11ea-86b2-42010a8e0014:1-1211761271";ERROR 3546 (HY000): @@GLOBAL.GTID_PURGED cannot be changed: the new value must be a superset of the old value其实这个报错很简单,意思就是我们set的值必须得是当前机器上面gti原创 2021-08-12 20:00:04 · 9830 阅读 · 0 评论 -
MySQL——GTID复制如何用xtrabackup恢复数据库
背景我们的数据库使用的是GTID复制,今天老任为了避免单点利用备份文件恢复搭建从库的时候遇到了一些问题,所以就写了这篇笔记,加深学习理解。大家都知道,在搭建从库的时候,基本都是利用最近的一份xtrabackup备份文件,解压 apply对应的log之后会生成下图的一些相关文件。#可以看到解压应用后的关于备份位点信息的文件如下图所示$ ls -l xtrabackup*-rw-r--r--. 1 mysql mysql 400 8月 11 21:25 xtrabackup_bin原创 2021-08-12 19:50:14 · 851 阅读 · 0 评论 -
MySQL误区—字符和字节的区别
字符和字节的区别今天顺便说一下varchar(100)中,指的的是字符还是字节,这里给大家准确答案,这其中指的是字符个数。字符:字节:这里是百度百科的结果,可以很明显的帮大家区别,简单理解,就是字符是我们看到的,字节是计算机看到的,是不是很明了这里可能有人会问了英文字符和中文字符的区别:我们看一个sql:mysql [localhost:5731] {msandbox} (test) > show create table t;+-------+---------------原创 2021-08-11 20:56:30 · 719 阅读 · 0 评论 -
【MySQL】增大字符串长度不会锁表吗
MySQL增大字符串长度锁表?复习自己的笔记的时候看到了一个自己之前的误区,之前一直以为mysql增大varchar的长度并不会锁表,不知道是不是很多人和我以为的都是一样的,然而其实在一些情况下是会导致MDL锁的。这里来分析一下,首先我们看官方文档的说明可以看到这块增大长度是允许onlineDDL的。先说一个题外话,我们知道存储255这个数字需要1BYTES来存储,也就是11111111(二进制),所以说在varchar长度小于255的时候会采用一个BYTES记录255以内的长度,一旦超过原创 2021-08-11 20:31:48 · 2314 阅读 · 0 评论 -
MySQL工作记录——并行复制同步出错Last_Errno: 1032 Last_Error: Coordinator stopped because
背景老任今天工作又遇到了一个奇葩问题,先说一下背景,方便大家快速理解这个报错。>show slave status\G;....Last_Errno: 1032Last_Error: Coordinator stopped because there were error(s) in the worker(s). The most recent failure being: Worker 1 failed executing transaction '233f10d6-5f9e-11eb-原创 2021-08-11 19:49:15 · 1027 阅读 · 2 评论 -
MySQL神器—快速生成大量测试数据mysqlslap
背景老任最近开始准备全面学习下Percona-Tookit工具系列,熟悉会的,学习之前没有了解到的,所以过程中难免需要一些测试数据,测试数据生成呢,网上相信一搜一大篇,但是老任最近学习到了一个新的方法分享给大家。顺便总结一下都有哪些快速生成方法。快速生成测试数据方法老任总结了一下三种方式分享给大家。代码操作数据库生成数据。通过代码操作数据库借口,比如pymysql,jdbc,shell脚本生成测试数据。存储过程操作数据库生成数据。网上有很多的这种,写一个存储过程,然后call一下即可。my原创 2021-08-10 23:18:58 · 6899 阅读 · 2 评论 -
【Percona-Toolkit】系列之pt-algin格式化神器
工具简介pt-alginusage:格式化文本的输出,使得文本看起来更加整洁使用方法一般来说pt-algin又两种方法,使用如下1.格式化文件,比如我们使用数据库导出的csv文件,看起不太美观但是经过pt-algin会很美观(注意该方式只会将文件格式化输出展示出来,并不会真正修改文件内容)#使用如下$ mysql -uroot -p -s -N -e "select user,host from mysql.user;" > test.csvmysql: [Warning] Us原创 2021-08-10 21:42:34 · 167 阅读 · 2 评论 -
DBA必备神器---Percona-Toolkit
为什么要写这篇文章?其实作为一个DBA,肯定避免不了一些慢查询分析,主从一致校验,online DDL等等,批量kill数据库连接回话等等。相信Percona-toolkit这个工具包并不默认,因为这个工具包里面提供了很多的封装好的命令,功能强大,但我其实也只了解一些上面的常用的,但是既然有这个工具包,肯定还是需要熟悉一下的,所以接下来我要写一个系列,一方面是学习,一方面是复习记录一下。接下来的所有测试都会基于以下:数据库版本:5.7.34master [localhost:20135] {原创 2021-08-10 19:49:47 · 770 阅读 · 1 评论 -
MySQL分区表---自动增删管理分区
分区表管理脚本功能:实现分区表的自动管理,支持按天或者按月创建分区或者删除分区,自测已经通过,分享给大家。可直接运行,但是记得先在测试环境操作,不要直接上生产。#!/bin/bashdatabase_name=$1table_prefix=$2keep_time=$3partition_rules=$4#数据库用户db_user='user'db_pass='pass'db_host='localhost'help(){ cat <<- EOF Desc:该脚本原创 2021-08-09 20:22:17 · 596 阅读 · 0 评论 -
MySQL----InnoDB体系架构学习笔记
数据库体系架构回顾复习一下体系架构:首先MySQL数据库的架构如下:InnoDB体系架构1.架构图可以看到innodb的整个体系架构就是由多个内存块组成的缓冲池及多个后台线程构成。缓冲池缓存磁盘数据(解决cpu速度和磁盘速度的严重不匹配问题),后台进程保证缓存池和磁盘数据的一致性(读取、刷新),并保证数据异常宕机时能恢复到正常状态2.四个线程1.master thread:将缓冲池中的数据异步刷新到磁盘最高级别线程分为两种操作每1s的操作:日志缓冲刷新到磁盘,尽管事务没提原创 2021-08-07 18:31:52 · 126 阅读 · 1 评论 -
MySQL进阶篇:如何根据源码学习排查问题
写在开头最近有看到很多人对于问题不知道怎么下手,之前自己的途径无非就是查询博客资料等,但是有时候查到的差异很大,所以就导致没有一个最标准的,所以有的时候就很无助,所以很多小伙伴可能会想着查看源码,但是又不知道如何查看源码,这里我就分享一下我自己工作中遇到问题,如何查看源码的。不是个大佬,只是分享一下自己的经验。所需工具1.数据库源码包:官方下载地址: https://dev.mysql.com/downloads/mysql/或者我的优快云上传资源的里面可以免费下载。2.查看工具我自己用的p原创 2021-08-07 17:49:13 · 521 阅读 · 1 评论 -
推荐几本DBA提升的书籍
作为一个DBA,这段时间了解过很多书籍以及自己之前看过的,觉得一些些的不错的推荐给大家:FOR DBA和内核开发1.书名<MySQL运维内参>推荐理由: 对于想做DBA的朋友,了解数据库的朋友非常适合,日常的一些运维操作。2.书名<深入浅出MySQL>推荐理由:主要讲述数据库开发优化和管理。3.书名<高性能MySQL>推荐理由:偏向于致力于数据库优化的朋友。包含一些参数,硬件软件架构等优化。4.书名<数据库查询优化器的艺术>推荐理由:偏向于原创 2021-08-07 15:10:03 · 1256 阅读 · 3 评论 -
MySQL 重命名数据库名称脚本
背景因为MySQL不支持rename database,只支持rename table。最近有很多朋友问我重命名数据库的问题,自己最近也用到。所以就简单搞了一个脚本实现了重命名database,比较简单,顺便分享一下,可以直接拿去用。脚本内容#!/bin/bash#usage: sh 脚本名 老的数据库名称 新的数据库名称#比如我要将t1数据库重命名为t2,那么操作如下:#sh 脚本名 t1 t2#old_database=$1new_database=$2#自己的数据库用户名密原创 2021-08-06 18:09:37 · 461 阅读 · 1 评论