MySQL Test Suite使用

MySQL自动测试套件(The MySQL Test Suite)用于对MySQL程序进行测试,包括各种功能与存储引擎。包含于MySQL与MariaDB版本代码中,位于mysql-test目录下。总体测试脚本为mysql-test-run.pl。该perl脚本通过调用各种已有的测试脚本,将测试结果与预置的result文件做对比来判断测试是否通过。(任何一点差异都会导致测试失败,包括预期之外的warning)

一、主要目录介绍

    • include
包含.inc文件,用于测试开始时判断是否满足测试条件,在测试用通过source命令引入
如hava_innodb.inc:

如不满足,则会跳过需要该验证的测试。

    • suite
包含所有测试suite,每一个suite为一个测试用例集,具体用例集在2节介绍
    • t
1、测试文件
例:1st.test

上面内容即为1st这个测试用例的测试脚本

 2、配置文件
例:innodb_bug53674-master.opt
–loose-innodb-locks-unsafe-for-binlog –binlog-format=mixed
为该测试需要的特殊配置项
3、脚本文件,在测试开始之前执行的脚本
例:rpl_misc_functions-slave.sh
rm -f $MYSQLTEST_VARDIR/master-data/test/rpl_misc_functions.outfile
    • r
结果文件,判断是否通过的依据
使用上面的例子:1st.result

执行完1st用例会严格比对该文件。完全一致则测试通过。

    • std_date
有些测试需要用到一些标准数据。
    • var
测试默认使用该文件夹下的my.cnf文件

二、测试用例集

./mysql-test-run.pl不带任何参数表示执行所有测试用例集。使用—suite=suitename来指定单独执行suitename目录下的所有测试用例。
测试用例集包括:

 

三、主要参数

force:默认情况下,只要遇到一个用例出错,测试程序就会退出,在指定force的情况下,测试程序会继续执行下面的测试(但是最多发现10个错误还是会退出)
suite:指定使用的测试suite
do-test:会以输入的字符串进行匹配用例执行
skip-test:会以输入的字符串进行匹配跳过用例执行
big-test:执行标记为big的测试用例。因为用例较大、耗时较长,标记为big的用例默认不会执行。输入两遍big-test则只执行标记为big的测试用例
recored:重新生成结果文件
mysqld:传递启动参数给mysqld,每个参数需要分别指定一个mysqld
其他还有很多选项,可以使用./mtr –help查看
如果需要在服务启动前执行一些脚本,可以写在 t/testname.sh文件中,由mtr自动执行。

四、测试举例

例1:
可以看出共完成12个测试用例,全部通过。1个用例必须在debug模式下测试,所以跳过。测试过程中服务重启3次。测试默认使用16000-16019端口。
例2:

每个测试结束前,mtr会检索error日志,如果发现warning或error,则测试失败。

再来看两个失败用例:
(截取部分日志)

分析日志可以看出是在测试过程中在错误日志中发现了warnings/errors。原因是使用了废弃的参数innodb_locks_unsafe_for_binlog导致warning。

找到并修改配置文件:innodb_bug53674-master.opt
将–loose-innodb-locks-unsafe-for-binlog –binlog-format=mixed
修改为:–transaction-isolation=READ-COMMITTED –binlog-format=mixed
重新测试:

不再有warning,测试通过。

Mysql主备延时监控工具pt-heartbeat

pt-heartbeat是percona toolkit里带的一个监控Mysql主备延时的工具。
       编译、安装:
       perl Makefile.PL
       make
       make install
       工具原理:
  1. 在主上建立一张heartbeat表,定时向该表插入当前时间戳。
  2. 在备机上定时查询该表的时间戳,并与当前系统时间对比,计算出的差值即为从落后主的时间。
  3. 使用前提:主备系统时间必须一致。可以使用ntp服务同步。
使用步骤:
  1. 在主上运行:pt-heartbeat –user=root –host=10.47.160.26 –create-table -D lzk –interval=1 –update –daemonize 初始化表并建立后台进程定时更新heartbeat表
  2. 在备上运行:pt-heartbeat -D lzk –table=heartbeat –monitor –user=root –host=10.47.160.26 –interval=1 –port=5182 监控
[lzk2@redhat64-26 ~]$ pt-heartbeat -D lzk –table=heartbeat –monitor –user=root –host=10.47.160.26 –interval=1 –port=5182
184.00s [  3.07s,  0.61s,  0.20s ]
185.00s [  6.15s,  1.23s,  0.41s ]
186.00s [  9.25s,  1.85s,  0.62s ]
187.00s [ 12.37s,  2.47s,  0.82s ]
186.95s [ 15.48s,  3.10s,  1.03s ]
187.95s [ 18.61s,  3.72s,  1.24s ]
188.95s [ 21.76s,  4.35s,  1.45s ]
189.95s [ 24.93s,  4.99s,  1.66s ]
190.95s [ 28.11s,  5.62s,  1.87s ]
191.95s [ 31.31s,  6.26s,  2.09s ]
192.95s [ 34.53s,  6.91s,  2.30s ]
193.95s [ 37.76s,  7.55s,  2.52s ]
当前延时   1分钟   5分钟  15分钟的平均值

MariaDB&MySQL数据库及操作系统字符集设置及关系

1         LINUX操作系统

1.1       系统LANG变量

可以使用locale -a查看系统支持的字符集。
使用export LANG=zh_CN.utf8或zh_CN.gbk进行设置。
如使用ssh客户端连接服务器,如SecrueCRT等,需要设置与服务器相同的字符集才能正常显示。

2         数据库

2.1       数据库字符集变量

查看数据库系统字符集信息:
这些变量都可以通过set 及set global进行修改,重启后失效。

以下为每个变量介绍:

  • character_set_client :客户端字符集,可以通过修改my.cnf中[client]段中的default-character-set,重启客户端生效。
  • character_set_connection:连接字符集,可以通过修改my.cnf中[client]段中的default-character-set,重启客户端生效。
  • character_set_database:数据库默认字符集,创建数据库时指定,不指定则默认使用服务器字符集。建表时如不指定字符集则继承数据库默认字符集。Load data时数据文件字符集需与该值一致。
  • character_set_filesystem :文件系统字符集,linux系统默认为binary。该值不会影响乱码。
  • character_set_results:结果字符集,可以通过修改my.cnf中[client]段中的default-character-set,重启客户端生效。
  • character_set_server:服务器默认字符集,可以通过修改my.cnf中[mysqld]段中的character-set-server,重启服务端生效。如果不配置,则以编译代码时的-DDEFAULT_CHARSET选择为默认值。默认为latin1。
  • character_set_system:MariaDB系统自用字符集,恒为utf8。该值不会影响乱码。
SET NAMES ‘utf8’;  它相当于下面的三句命令:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;

2.1.1    表以及列字符集

创建表时指定表和列的字符集,如果不指定,则列从表继承,表从character_set_database继承。后期也可通过alter table命令修改。

2.2       SQL脚本

一个用户请求字符集转换完整流程:

1、Mysql客户端以character_set_client解析SQL语句

2、转化为character_set_connection发送到服务端(character_set_connection字符集必须大于等于character_set_client,否则会丢失数据。如utf8>gbk>latin1)

3、服务端转化为内部字符集

(同理,内部字符集必须大于等于character_set_connection,否则会丢失数据。
按照如下规则:
    A. 转化为每个数据字段的CHARACTER SET设定值;
    B. 若上述值不存在,则继承对应数据表的CHARACTER SET设定值
    C. 若上述值不存在,则继承对应数据库的 character_set_database设定值;
    D. 若上述值不存在,则继承character_set_server设定值。)

4、最后服务端将操作结果从内部操作字符集转换为character_set_results返回客户端。

sql脚本编码必须与character_set_client一致,否则会出现乱码。

2.3       LOAD导入数据文件

LOAD命令字符集转换完整流程:

1、以LOAD命令里指定的CHARACTER SET解析数据文件(如没有指定,则以character_set_database设定值解析)

2、服务端转化为内部字符集(规则同2.2)

如不在LOAD命令中指定,则数据文件编码必须与character_set_database一致,否则会出现编码错误无法导入。

2.4       导出数据文件

如不在导出命令中指定字符集,则不进行转换,以数据列的字符集直接导出。(如果表的不同字段设置的字符集不同,会导致同一数据文件存在多种编码格式,如:字段a以utf8编码,b以gbk编码。)
如在命令中指定字符集,则按照指定的字符集导出到文件中。