
本期我们用 MySQL 提供的 DBUG 工具来研究 MySQL 的 SQL 处理流程。
起手先造个实例
这里得稍微改一下实例的启动文件 start,将 CUSTOM_MYSQLD 改为 mysqld-debug:
重启一下实例,加上 debug 参数:
我们来做一两个实验,说明 DBUG 包的作用:
先设置一个简单的调试规则,我们设置了两个调试选项:
d:开启各个调试点的输出
O,/tmp/mysqld.trace:将调试结果输出到指定文件
请点击输入图片描述
然后我们创建了一张表,来看一下调试的输出结果:
请点击输入图片描述
可以看到 create table 的过程中,MySQL 的一些细节 *** 作,比如分配内存 alloc_root 等
这样看还不够直观,我们增加一些信息:
请点击输入图片描述
来看看效果:
请点击输入图片描述
可以看到输出变成了调用树的形式,现在就可以分辨出 alloc_root 分配的内存,是为了解析 SQL 时用的(mysql_parse)
我们再增加一些有用的信息:
请点击输入图片描述
可以看到结果中增加了文件名和行号:
请点击输入图片描述
现在我们可以在输出中找一下统计表相关的信息:
请点击输入图片描述
可以看到 MySQL 在这里非常机智,直接执行了一个内置的存储过程来更新统计表。
沿着 que_eval_sql,可以找到其他类似的统计表,比如下面这些:
请点击输入图片描述
请点击输入图片描述
本次实验中,我们借助了 MySQL 的 DBUG 包,来让 MySQL 将处理过程暴露出来。MySQL 中类似的技术还有不少,比如 performance_schema,OPTIMIZER_TRACE 等等。
这些技术将 MySQL 的不同方向的信息暴露出来,方便大家理解其中机制。
character introducer翻译过来就是字符引导。也就是针对字符串,显式的给定一个字符编码和排序规则,不受系统参数的影响。
总结 Introducer 使用规则:
1. convert 函数
convert 函数类似于 introducer,不过只能指定字符集。
2. charset 函数
检测字符串的字符集。可以检测出当前字符串在当前 session 的字符集。
3. set names 语句
语法为:
SET NAMES {'charset_name'[COLLATE 'collation_name'] | DEFAULT}这条语句最常用,可是也最容易被滥用,比如语句:
set names latin1 collate latin1_bin
执行后会默认执行一系列语句,也就是把非服务端的相关参数给重新设定了。
4. set character set 语句语法为:
SET {CHARACTER SET | CHARSET}{'charset_name' | DEFAULT}类似语句 set names,同样是设置以下三个 session 参数:
character_set_results
character_set_client
character_set_connection
同样是可以恢复默认值,还有同样的限制规则等。不过有两点不同:1)参数 character_set_connection 的值不会被设定为指定的字符集,而是继承参数 character_set_database 所设定的字符集。
5. collate 子句
collate 语句强制指定排序规则,优先级最高。也就是显式指定 collate 会覆盖已有的排序规则。
这里涉及到单个字符串以及字符串拼接的排序规则问题。
有两种方法,一种方法使用mysql的checktable和repairtable的sql语句,另一种方法是使用MySQL提供的多个myisamchk,isamchk数据检测恢复工具。前者使用起来比较简便。推荐使用。1.checktable和repairtable登陆mysql终端:mysql-uxxxxx-pdbnamechecktabletabTest如果出现的结果说Status是OK,则不用修复,如果有Error,可以用:repairtabletabTest进行修复,修复之后可以在用checktable命令来进行检查。在新版本的phpMyAdmin里面也可以使用check/repair的功能。2.myisamchk,isamchk其中myisamchk适用于MYISAM类型的数据表,而isamchk适用于ISAM类型的数据表。这两条命令的主要参数相同,一般新的系统都使用MYISAM作为缺省的数据表类型,这里以myisamchk为例子进行说明。当发现某个数据表出现问题时可以使用:myisamchktablename.MYI进行检测,如果需要修复的话,可以使用:myisamchk-oftablename.MYI关于myisamchk的详细参数说明,可以参见它的使用帮助。需要注意的时在进行修改时必须确保MySQL服务器没有访问这个数据表,保险的情况下是最好在进行检测时把MySQL服务器Shutdown掉。-----------------------------另外可以把下面的命令放在你的rc.local里面启动MySQL服务器前:[-x/tmp/mysql.sock]&&/pathtochk/myisamchk-of/DATA_DIR/*/*.MYI其中的/tmp/mysql.sock是MySQL监听的Sock文件位置,对于使用RPM安装的用户应该是/var/lib/mysql/mysql.sock,对于使用源码安装则是/tmp/mysql.sock可以根据自己的实际情况进行变更,而pathtochk则是myisamchk所在的位置,DATA_DIR是你的MySQL数据库存放的位置。需要注意的时,如果你打算把这条命令放在你的rc.local里面,必须确认在执行这条指令时MySQL服务器必须没有启动!检测修复所有数据库(表)欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)