Skip to content
bluethinking edited this page Oct 18, 2012 · 2 revisions
  • 简介
    InnoSQL Profiler主要通过创建Profiler,并且绑定该Profiler到指定的用户,来实现对用户的CPU时间、IO使用次数的限制
    实现
    InnoSQL Profiler需要修改mysql.user表的表结构,如下:
    user | CREATE TABLE `user` (
    `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT ‘’,
    `User` char(16) COLLATE utf8_bin NOT NULL DEFAULT ’’,
    `Password` char(41) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT ‘’,
    `Select_priv` enum(’N’,‘Y’) CHARACTER SET utf8 NOT NULL DEFAULT ‘N’,
    `Insert_priv` enum(‘N’,‘Y’) CHARACTER SET utf8 NOT NULL DEFAULT ‘N’,
    `Update_priv` enum(‘N’,‘Y’) CHARACTER SET utf8 NOT NULL DEFAULT ‘N’,
    `Delete_priv` enum(‘N’,‘Y’) CHARACTER SET utf8 NOT NULL DEFAULT ‘N’,
    `Create_priv` enum(‘N’,‘Y’) CHARACTER SET utf8 NOT NULL DEFAULT ‘N’,
    `Drop_priv` enum(‘N’,‘Y’) CHARACTER SET utf8 NOT NULL DEFAULT ‘N’,
    `Reload_priv` enum(‘N’,‘Y’) CHARACTER SET utf8 NOT NULL DEFAULT ‘N’,
    `Shutdown_priv` enum(‘N’,‘Y’) CHARACTER SET utf8 NOT NULL DEFAULT ‘N’,
    `Process_priv` enum(‘N’,‘Y’) CHARACTER SET utf8 NOT NULL DEFAULT ‘N’,
    `File_priv` enum(‘N’,‘Y’) CHARACTER SET utf8 NOT NULL DEFAULT ‘N’,
    `Grant_priv` enum(‘N’,‘Y’) CHARACTER SET utf8 NOT NULL DEFAULT ‘N’,
    `References_priv` enum(‘N’,‘Y’) CHARACTER SET utf8 NOT NULL DEFAULT ‘N’,
    `Index_priv` enum(‘N’,‘Y’) CHARACTER SET utf8 NOT NULL DEFAULT ‘N’,
    `Alter_priv` enum(‘N’,‘Y’) CHARACTER SET utf8 NOT NULL DEFAULT ‘N’,
    `Show_db_priv` enum(‘N’,‘Y’) CHARACTER SET utf8 NOT NULL DEFAULT ‘N’,
    `Super_priv` enum(‘N’,‘Y’) CHARACTER SET utf8 NOT NULL DEFAULT ‘N’,
    `Create_tmp_table_priv` enum(‘N’,‘Y’) CHARACTER SET utf8 NOT NULL DEFAULT ‘N’,
    `Lock_tables_priv` enum(‘N’,‘Y’) CHARACTER SET utf8 NOT NULL DEFAULT ‘N’,
    `Execute_priv` enum(‘N’,‘Y’) CHARACTER SET utf8 NOT NULL DEFAULT ‘N’,
    `Repl_slave_priv` enum(‘N’,‘Y’) CHARACTER SET utf8 NOT NULL DEFAULT ‘N’,
    `Repl_client_priv` enum(‘N’,‘Y’) CHARACTER SET utf8 NOT NULL DEFAULT ‘N’,
    `Create_view_priv` enum(‘N’,‘Y’) CHARACTER SET utf8 NOT NULL DEFAULT ‘N’,
    `Show_view_priv` enum(‘N’,‘Y’) CHARACTER SET utf8 NOT NULL DEFAULT ‘N’,
    `Create_routine_priv` enum(‘N’,‘Y’) CHARACTER SET utf8 NOT NULL DEFAULT ‘N’,
    `Alter_routine_priv` enum(‘N’,‘Y’) CHARACTER SET utf8 NOT NULL DEFAULT ‘N’,
    `Create_user_priv` enum(‘N’,‘Y’) CHARACTER SET utf8 NOT NULL DEFAULT ‘N’,
    `Event_priv` enum(‘N’,‘Y’) CHARACTER SET utf8 NOT NULL DEFAULT ‘N’,
    `Trigger_priv` enum(‘N’,‘Y’) CHARACTER SET utf8 NOT NULL DEFAULT ‘N’,
    `Create_tablespace_priv` enum(‘N’,‘Y’) CHARACTER SET utf8 NOT NULL DEFAULT ‘N’,
    `Profile_priv` enum(‘N’,‘Y’) CHARACTER SET utf8 NOT NULL DEFAULT ‘N’,
    `ssl_type` enum(‘’,’ANY’,‘X509’,‘SPECIFIED’) CHARACTER SET utf8 NOT NULL DEFAULT ‘’,
    `ssl_cipher` blob NOT NULL,
    `x509_issuer` blob NOT NULL,
    `x509_subject` blob NOT NULL,
    `max_questions` int(11) unsigned NOT NULL DEFAULT ’0’,
    `max_updates` int(11) unsigned NOT NULL DEFAULT ‘0’,
    `max_connections` int(11) unsigned NOT NULL DEFAULT ‘0’,
    `max_user_connections` int(11) unsigned NOT NULL DEFAULT ‘0’,
    `plugin` char(64) COLLATE utf8_bin DEFAULT ‘’,
    `authentication_string` text COLLATE utf8_bin,
    `profile_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT ’’,
    PRIMARY KEY (`Host`,`User`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT=‘Users and global privileges’ |
    相对于原来的user表,增加了Profile_priv和profile_name两项,分别表示user对应的Profile操作权限和绑定的Profile名称
    在mysql库下增加两张表,如下:
    current_user_exhaust | CREATE TABLE `current_user_exhaust` (
    `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT ‘’,
    `User` char(16) COLLATE utf8_bin NOT NULL DEFAULT ’’,
    `curr_cpu_times` int(11) unsigned NOT NULL DEFAULT ‘0’,
    `curr_io_reads` int(11) unsigned NOT NULL DEFAULT ‘0’,
    PRIMARY KEY (`Host`,`User`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT=‘current_user_exhaust’ |

user_profiler | CREATE TABLE `user_profiler` (
`Profile_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT ‘’,
`Max_cpu_times` int(11) unsigned NOT NULL DEFAULT ’0’,
`Max_io_reads` int(11) unsigned NOT NULL DEFAULT ‘0’,
`Max_mem_size` int(11) unsigned NOT NULL DEFAULT ‘0’,
`Max_cpu_times_per_trx` int(11) unsigned NOT NULL DEFAULT ‘0’,
`Max_io_reads_per_trx` int(11) unsigned NOT NULL DEFAULT ‘0’,
PRIMARY KEY (`Profile_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT=‘Users profiler’ |
其中current_user_exhaust表用于记录当前用户的实际资源消耗,记录方式根据变量current_profiler_record设置的不同而不同,
user_profiler表用于保存创建的profile。

current_user_exhaust中相关列说明
host 表示连接到该数据库的客户端的主机名
user 表示连接到该数据库的用户
curr_cpu_times 表示该用户(user@host)当前的cpu时间消耗
curr_io_reads 表示该用户(user@host)当前的IO消耗

user_profiler中相关列说明
profile_name 创建的profiler的名称
max_cpu_times 最大CPU使用时间
max_io_reads 最大的IO使用次数
max_mem_size 当前没有用到
max_cpu_times_per_trx 单个事务的最大CPU使用时间
max_io_reads_per_trx 单个事务的最大IO使用次数

Profile的创建和绑定到指定用户都通过SQL Command进行,上面两个表禁止任何的insert/delete/update等操作
在InnoSQL中添加相关Profile的SQL语句如下:

1.Create Profile
CREATE PROFILE profile_name LIMIT
MAX_CPU_TIMES_PROFILE VALUES
MAX_IO_READS_PROFILE VALUES
MAX_CPU_TIMES_PER_TRX_PROFILE VALUES
MAX_IO_READS_PER_TRX_PROFILE VALUES
上面的MAX_CPU_TIMES_PROFILE,MAX_IO_READS_PROFILE,MAX_CPU_TIMES_PER_TRX_PROFILE,MAX_IO_READS_PER_TRX_PROFILE可以出现1项或多项,
分别对应user_profiler表中的相关列,VALUES是一个整数

2.Alter Profile
ALTER PROFILE profile_name LIMIT
MAX_CPU_TIMES_PROFILE VALUES
MAX_IO_READS_PROFILE VALUES
MAX_CPU_TIMES_PER_TRX_PROFILE VALUES
MAX_IO_READS_PER_TRX_PROFILE VALUES
alter profile跟create类似,只是用来修改profile_name对应profile的各项值

3.Drop Profile
DROP PROFILE profile_name
如果profile_name已经绑定到用户,则清空所有用户中该profile的绑定

4.绑定profile到用户
ALTER USER user PROFILE profile_name;
绑定名为profile_name的profile到指定用户user,如果profile_name不存在,则绑定失败

用户在执行SQL时,当所消耗的资源达到Profile限制时,当前执行的事务将被回滚。

所有上述SQL操作都对当前连接的用户无效,需要执行flush privileges后才能生效。
profile的限制是相对于用户的(user@host),所以,对于profile的修改,对所有该用户的多个连接都有效,所有相同用户的连接都共享Profile限定的资源
配置
current_profiler_record
该配置用于决定在什么时候保存用户的当前资源使用信息到current_user_exhaust表,取值为0,1,2
0不保存用户的当前资源使用信息到current_user_exhaust表,如果配置了该值,发生数据库意外关闭,起来后用户的资源消耗将会被清0
1当用户退出时保存当前资源使用信息到current_user_exhaust表,如果配置了该值,发生数据库意外关闭,则最近一次用户退出的资源消耗会被保存
2每执行一条事务,保存相关资源使用信息到current_user_exhaust表,如果配置了该值,发生数据库意外关闭,则不会丢失资源消耗信息

Clone this wiki locally