这是本人写的一个数据库压力测试的工具,该工具内置了22条sql语句(基于TPCH测试),可以对数据库类型,数据库、密码进行设置
可以设置压力测试的连接数。可以自定义测试的sql语句。
并将测试结果保持在csv格式的文件中。
急了测试出错时情况,可以自定义日志的轮转策略
设计的技术:TPCH、C3P0连接池、线程池、csv文件格式、log4j
MySQLslap是mysql自带的工具,不需要单独安装:
参数:
-concurrency 代表并发数量,多个可以用逗号隔开,concurrency=10,50,100, 并发连接线程数分别是10、50、100个并发。
--engines 代表要测试的引擎,可以有多个,用分隔符隔开。
--iterations 代表要运行这些测试多少次。
--auto-generate-sql 代表用系统自己生成的SQL脚本来测试。
--auto-generate-sql-load-type 代表要测试的是读还是写还是两者混合的(read,write,update,mixed)
--number-of-queries 代表总共要运行多少次查询。每个客户运行的查询数量可以用查询总数/并发数来计算。
--debug-info 代表要额外输出CPU以及内存的相关信息。
--number-int-cols :创建测试表的 int 型字段数量
--auto-generate-sql-add-autoincrement : 代表对生成的表自动添加auto_increment列,从5.1.18版本开始
--number-char-cols 创建测试表的 char 型字段数量。
--create-schema 测试的schema,MySQL中schema也就是database。
--query 使用自定义脚本执行测试,例如可以调用自定义的一个存储过程或者sql语句来执行测试。
--only-print 如果只想打印看看SQL语句是什么,可以用这个选项。
1,简单用法
[root@linuxidc /home/aolens]# mysqlslap --user=root --password=password --auto-generate-sql
Benchmark
Average number of seconds to run all queries: 0.002 seconds
Minimum number of seconds to run all queries: 0.002 seconds
Maximum number of seconds to run all queries: 0.002 seconds
Number of clients running queries: 1
Average number of queries per client: 0
结果中各项含义:
Average number of ... 运行所有语句的平均秒数
Minimum number of ... 运行所有语句的最小秒数
Maximum number of ... 运行所有语句的最大秒数
Number of clients ... 客户端数量
Average number of queries per client 每个客户端运行查询的平均数
2,添加并发
[root@linuxidc /home/aolens]# mysqlslap --user=root --password=password --auto-generate-sql --concurrency=100 --number-of-queries=1000
Benchmark
Average number of seconds to run all queries: 0.316 seconds
Minimum number of seconds to run all queries: 0.316 seconds
Maximum number of seconds to run all queries: 0.316 seconds
Number of clients running queries: 100
Average number of queries per client: 10
3,使用自己测试库和测试语句
[root@linuxidc /home/aolens]# mysqlslap --user=root --password=password --concurrency=10 --number-of-queries=100 --create-schema=wordpress --query="SELECT * FROM wordpress.wp_posts;"
Benchmark
Average number of seconds to run all queries: 4.255 seconds
Minimum number of seconds to run all queries: 4.255 seconds
Maximum number of seconds to run all queries: 4.255 seconds
Number of clients running queries: 10
Average number of queries per client: 10
4,结合实际,对网站首页所请求的数据库连接做压力测试
数据库Mariadb 10.0.14
首先给数据库安装审计插件,并启用
MariaDB [(none)]> show variables like '%audit%'
-> ;
+-------------------------------+-----------------------+
| Variable_name | Value |
+-------------------------------+-----------------------+
| server_audit_events | |
| server_audit_excl_users | |
| server_audit_file_path | server_audit.log |
| server_audit_file_rotate_now | OFF |
| server_audit_file_rotate_size | 1000000 |
| server_audit_file_rotations | 9 |
| server_audit_incl_users | |
| server_audit_logging | OFF |
| server_audit_mode | 0 |
| server_audit_output_type | file |
| server_audit_syslog_facility | LOG_USER |
| server_audit_syslog_ident | mysql-server_auditing |
| server_audit_syslog_info | |
| server_audit_syslog_priority | LOG_INFO |
+-------------------------------+-----------------------+
14 rows in set (0.00 sec)
发现已经安装了,没有安装的MariaDB [(none)]> INSTALL PLUGIN server_audit SONAME 'server_audit.so';
命令行启动审计功能:
命令行启用audit ,重启后失效
MariaDB [(none)]> set global server_audit_file_rotate_size=1024*1024*1024;
Query OK, 0 rows affected (0.01 sec)
MariaDB [(none)]> set global server_audit_events='query,table';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> set global server_audit_file_rotate_now=on;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> set global server_audit_logging='ON';
Query OK, 0 rows affected (0.00 sec)
刷新一下首页查看审计日志里都有哪些SQL操作,对这些SQL进行压测:
mysqlslap --user=root --password=password --concurrency=20 --number-of-queries=1000 --create-schema=wordpress --query=" \
SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes'; \
SELECT option_value FROM wp_options WHERE option_name = 'a3_lz_google_api_key' LIMIT 1; \
SELECT option_value FROM wp_options WHERE option_name = 'a3_lz_google_api_key_enable' LIMIT 1; \
SELECT option_value FROM wp_options WHERE option_name = '_transient_timeout_a3_lz_google_api_key_status' LIMIT 1; \
SELECT option_value FROM wp_options WHERE option_name = '_transient_a3_lz_google_api_key_status' LIMIT 1; \
SELECT option_value FROM wp_options WHERE option_name = 'wordpress_api_key' LIMIT 1; \
SELECT option_value FROM wp_options WHERE option_name = 'onp_license_clipboard-images' LIMIT 1; \
SELECT autoload FROM wp_options WHERE option_name = 'onp_license_clipboard-images'; \
SELECT option_value FROM wp_options WHERE option_name = 'onp_version_check_clipboard-images' LIMIT 1; \
SELECT option_value FROM wp_options WHERE option_name = 'ossdl_https' LIMIT 1; \
SELECT option_value FROM wp_options WHERE option_name = 'uninstall_plugins' LIMIT 1; \
SELECT option_value FROM wp_options WHERE option_name = 'a3_lazy_load_just_installed' LIMIT 1; \
SELECT option_value FROM wp_options WHERE option_name = 'akismet_comment_nonce' LIMIT 1; \
SELECT option_value FROM wp_options WHERE option_name = 'preload_cache_counter' LIMIT 1; \
SELECT option_value FROM wp_options WHERE option_name = 'rewrite_rules' LIMIT 1; \
......"
Benchmark
Average number of seconds to run all queries: 40.931 seconds
Minimum number of seconds to run all queries: 40.931 seconds
Maximum number of seconds to run all queries: 40.931 seconds
Number of clients running queries: 20
Average number of queries per client: 50
这是本人写的一个数据库压力测试的工具,该工具内置了22条sql语句(基于TPCH测试),可以对数据库类型,数据库、密码进行设置
可以设置压力测试的连接数。可以自定义测试的sql语句。
并将测试结果保持在csv格式的文件中。
急了测试出错时情况,可以自定义日志的轮转策略
设计的技术:TPCH、C3P0连接池、线程池、csv文件格式、log4j
转载于:https://www.cnblogs.com/chenfei0801/p/3477634.html
jmeter工具对mysql 数据库实现压力测试:
1、新建线程组,设置并发线程量
2、新建JDBC Connection Configuration 在“配置元件”里。
配置相关属性:
variable name 需要定义一个名字
connection pool configuration 是配置连接池属性,包括最大连接数等
connection validation by pool
连接池和onnection validation by pool 我暂时用的默认
主要是配置: database connection configuration 这是连接数据库的字符串,与一般连接数据库字符串一致
database url:jdbc:mysql://10.190.215.231:3306/adsdb?useUnicode=true&characterEncoding=utf8
JDBC driver class:com.mysql.jdbc.Driver
username:账号
password:密码
3、新建JDBC Request 在“sampler”里
配置:
variable name 需要定义一个名字
sql query 里写相应sql .目前只做了简单查询
4、新建“监听器”,一般建“察看结果树”、“用表格察看结果”、“图形结果”、“聚合报告”
5、执行查看结果
在执行前,需要将 连接数据库的 jar 包放在 jmeter安装目录下的 lib包下,将上面的配置保存--》关闭--》重启--》打开 运行
否则找不到连接数据库驱动
详细查看图片
zcgonvh · 2014/04/25 12:41
原文链接:drops.wooyun.org/tips/1067。
在测试时发现了一些问题,于是把解决方案与一些结论共享出来,以供需要。
0x00 原文提供的powershell脚本出错的解决方案
原文提供的脚本直接导入执行会抛出“数据无效”的错误,测试系统在查询分析器中获取到的密文为:
[ 0x01, 0x00, 0x00, 0x00, 0xD0, 0x8C, 0x9D, 0xDF, 0x01, 0x15, 0xD1, 0x11, 0x8C, 0x7A, 0x00, 0xC0, 0x4F, 0xC2, 0x97, 0xEB, 0x01, 0x00, 0x00, 0x00, 0xCD, 0x2A, 0x0B, 0x54, 0x64, 0x6A, 0xBC, 0x4B, 0xB0, 0x99, 0xF1, 0xE6, 0x3D, 0x93, 0x9E, 0x6E, 0x04, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x53, 0x00, 0x51, 0x00, 0x4C, 0x00, 0x53, 0x00, 0x65, 0x00, 0x72, 0x00, 0x76, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x39, 0x00, 0x2E, 0x00, 0x30, 0x00, 0x20, 0x00, 0x4D, 0x00, 0x61, 0x00, 0x73, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x4B, 0x00, 0x65, 0x00, 0x79, 0x00, 0x20, 0x00, 0x45, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x72, 0x00, 0x79, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x03, 0x66, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3F, 0xDA, 0x14, 0xC2, 0xE9, 0x3E, 0xC7, 0xDE, 0x3A, 0x5C, 0xC2, 0xAE, 0x0F, 0x27, 0xAB, 0xAC, 0x00, 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x4C, 0xED, 0x01, 0x57, 0x33, 0x68, 0x06, 0x7E, 0x81, 0x4D, 0xB9, 0xF7, 0x13, 0xC6, 0x30, 0x34, 0x18, 0x00, 0x00, 0x00, 0xE9, 0x20, 0xD6, 0x91, 0xCD, 0x70, 0xF2, 0xC4, 0x0F, 0xB4, 0x97, 0xF7, 0xBB, 0x7C, 0x68, 0x76, 0x4D, 0x1F, 0x9D, 0x6D, 0xC8, 0x56, 0xBF, 0x04, 0x14, 0x00, 0x00, 0x00, 0xEA, 0x60, 0x44, 0xBC, 0xAC, 0xA3, 0x92, 0x1D, 0x04, 0xCC, 0x5E, 0x6C, 0x47, 0xE5, 0x1B, 0x0D, 0xE1, 0xF9, 0x29, 0xD8] 复制代码
长度为236字节。而在powershell中获取到的密文为:
[ 0x01, 0x00, 0x00, 0x00, 0xD0, 0x8C, 0x9D, 0xDF, 0x01, 0x15, 0xD1, 0x11, 0x8C, 0x7A, 0x00, 0xC0, 0x4F, 0xC2, 0x97, 0xEB, 0x01, 0x00, 0x00, 0x00, 0xCD, 0x2A, 0x0B, 0x54, 0x64, 0x6A, 0xBC, 0x4B, 0xB0, 0x99, 0xF1, 0xE6, 0x3D, 0x93, 0x9E, 0x6E, 0x04, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x53, 0x00, 0x51, 0x00, 0x4C, 0x00, 0x53, 0x00, 0x65, 0x00, 0x72, 0x00, 0x76, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x39, 0x00, 0x2E, 0x00, 0x30, 0x00, 0x20, 0x00, 0x4D, 0x00, 0x61, 0x00, 0x73, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x4B, 0x00, 0x65, 0x00, 0x79, 0x00, 0x20, 0x00, 0x45, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x72, 0x00, 0x79, 0x00, 0x70, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x03, 0x66, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3F, 0xDA, 0x14, 0xC2, 0xE9, 0x3E, 0xC7, 0xDE, 0x3A, 0x5C, 0xC2, 0xAE, 0x0F, 0x27, 0xAB, 0xAC, 0x00, 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x4C, 0xED, 0x01, 0x57, 0x33, 0x68, 0x06, 0x7E, 0x81, 0x4D, 0xB9, 0xF7, 0x13, 0xC6, 0x30, 0x34, 0x18, 0x00, 0x00, 0x00, 0xE9, 0x20, 0xD6, 0x91, 0xCD, 0x70, 0xF2, 0xC4] 复制代码
长度为196字节,少了40字节。经过多次测试发现问题处于查询语句中的len函数。
msdn(technet.microsoft.com/zh-cn/libra…)上对len函数的说明是:返回指定字符串表达式的字符数,其中不包含尾随空格。
由于函数返回的是字符数,自然要涉及编码。老外的操作系统是英文,默认使用IBM437 (OEM United States) 编码,这个编码是单字节字符集(sbcs),0x00-0xff都被认为是一个字符,所以获取的字符长度与字节长度相等。而中文操作系统默认使用gb2312编码,属于双字节字符集(dbcs),大于0x7f的字节都将与其后的一个字节合并作为一个字符,于是在处理含有大于0x7f的字节数组时,len函数获取的长度与字节数并不相等,最终会由于密文不完整而出错。统计完整密文中大于0x7f的字节总数并排除连续两个的情况,正好是40.
解决方案:
将原脚本第74行、第100行共计三个len函数换为datalength函数(technet.microsoft.com/zh-cn/libra…)。
0x01 原文错误的定论与拓展利用
原文中有两个错误的定论,而这两个定论在某些条件下恰好可以组合成为一个新的获取途径。
第一个错误的定论是存放熵的注册表键所属项权限,原文:“再次提醒,访问此表项需要本地系统的管理员权限。”的说法是完全错误的。
可以想象,如果sqlserver以低权限运行时不能访问这个注册表项,那么执行
sp_addlinkedsrvlogin
必然会抛出错误,而实际上无论sqlserver的权限是什么,这个键总可以被sqlserver所访问。在默认情况下,此键所在项(
HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\[instancename]\Security
)有以下四个权限:system:完全控制,子项继承 administrators:完全控制,子项继承 creator owner:完全控制 SQLServerMSSQLUser$[机器名]$[实例名]:查询,修改,创建子项,枚举子项,通知,读取DAC 复制代码
前两个权限不必解释,第三个权限代表所有者,一般为
system/administrator
。第四项代表sqlserver实例用户组,每个实例对应一个。在修改sqlserver某个实例的服务登录帐户时,会自动将这个账户加入此组。
所以当某个程序的运行账户与sqlserver某实例服务账户相同,那么这个程序可以打开注册表并读取此实例的Entropy Key。实际上,真正起到验证作用的实际上只有第四项。
第二个错误的定论是DAC连接的条件,原文:“打开专用管理员连接有两个条件:一是需要有sqlserver的Sysadmin权限,二是本地服务器的管理员权限。”。
而实际上,打开DAC链接只需要属于sysadmin固定服务器角色成员,DAC是支持远程连接的。
于是有以下推论:
1.当某个程序的运行账户与sqlserver某实例服务账户相同,那么这个程序可以打开注册表并读取此实例的Entropy Key。 2.由于实例服务账户所在用户组SQLServerMSSQLUser$[机器名]$[实例名]存在于sqlserver登陆名列表中并属于sysadmin固定服务器角色成员,于是这个凭据可用来打开DAC链接。 3.由于实例服务账户属于本地组成员,所以可以打开MachineKey进行加密解密。 4.连接服务器密码解密只依赖于Entropy Key,MachineKey和DAC链接 复制代码
最后得出结论:
当某个程序的运行账户与sqlserver某实例服务账户相同,则此程序可以获取到此sqlserver实例中所有链接服务器的密码。 复制代码
在实际利用上,一个典型例子就是iis。众所周知2003的iis默认应用程序池权限是Network Service,而一些管理员对sqlserver降权的做法也是将sqlserver实例服务账户更改为Network Service。于是在上述情况下,任何asp.net应用程序都可以通过windows验证方式直接作为sa登陆,同时解密并导出链接服务器密码。对于asp等由于使用了来宾帐户作为默认凭据,则需要执行额外的程序来获取。
如图:当sqlserver实例服务账户配置为network service运行时,默认iis应用程序池账户network service具有读取注册表的权限:
于是可以通过工具直接获取到链接服务器密码:
有了以上结论与原始的Powershell脚本,工具也就不难写了,Powershell脚本实际上就是.net类库的调用,略作修改即可。
lspwd.exe为一键获取工具,lspwd.js为源码,编译命令行:
jsc /r:system.xml.dll lspwd.js 复制代码
在asp.net中利用的工具以AspxSpy插件形式提供,GetMSSQLLinkedServerPasswordPlugin.cs为源码,编译命令行:
csc /t:library GetMSSQLLinkedServerPasswordPlugin.cs 复制代码
GetMSSQLLinkedServerPasswordPlugin.dll
和GetMSSQLLinkedServerPasswordPlugin.dll.Deflated
分别为未压缩和压缩后的插件。插件信息如下:
TypeName:Zcg.Test.AspxSpyPlugins.GetMSSQLLinkedServerPasswordPlugin MethodName:Run HTML Result:true Params:null 复制代码
输出:当前服务器所有能成功连接的sqlserver实例中所有链接数据库信息。
调用结果如图: