10. read_only
功能:当启用read_only系统变量时,除了拥有「super」权限的用户之外,服务器不允许客户端执行更新操作。此变量默认是禁用的
作用域:global
动态:√
取值:[0 | 1]
说明:
① read_only仅作为global变量存在,所以更改read_only需要「super」权限;
② read_only可以在slave server上独立设置,不受master上设置的影响;
③ master server上对read_only的更改不会被复制到slave上;
即使启用了read_only,服务器也允许如下操作:
如果服务器是一个replication slave,那么由slave线程执行的更新,则被允许。在设置replication时,可以在slave server上启用read_only,使其只接受来自master的更新,而不接受来自客户端的更新;
使用analyze table或optimize table语句。只读模式的作用是防止更改表的结构或表的内容。分析和优化并不改变这两者。这意味着,在启用了read_only的replication slave上可以使用「mysqlcheck --all-databases --anayze」来进行一致性检查;
在temporary表上的操作;
对日志表的插入(mysql.general_log 和 mysql.slow_log)
9. old_passwords
功能:此变量控制password()函数使用的密码散列方法。它还会影响由create user和grant语句执行的密码散列,这些语句通过identified by子句来指定密码
作用域:global && session
动态:√
取值:[0 | 1]
说明:
① 具体散列方法取决于会话变量;
② 当@@session.old_passwords = 0时,使用4.1哈希方法,生成的密码长度为64 Byte,且以「*」打头
例如:「*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29」
③ 当@@session.old_passwords = 1时,使用pre-4.1哈希方法,生成的密码长度为16 Byte
例如:「0900cf28532c31ea」
④ @@session.old_passwords = 1时,password(str)返回值与old_password(str)相同,且old_password()函数不受「old_passwords」值影响
⑤ 使用pre-4.1哈希方法的密码,安全性不高,应该避免
⑥ MySQL C++ connector不支持使用pre-4.1密码的账号,会导致连接失败,返回如下错误:
sql error: Authentication plugin 'mysql_old_password' cannot be loaded: /usr/local/mysql/lib/plugin/mysql_old_password.so: cannot open shared object file: No such file or directory
8. foreign_key_checks
功能:开启或禁用InnoDB表外键约束
作用域:global && session
动态:√
取值:[0 | 1]
说明:
① 如果设置为1(默认值),则会检查InnoDB表的外键约束;如果设置为0,外键约束将被忽略,但有一些例外:
◇ 当重新创建已经删除的表时,如果表定义不符合引用该表的外键约束,则返回错误;
◇ 同样,如果外键定义不正确,ALTER TABLE操作将返回错误
② 禁用外键约束对于,按照不同于父/子关系所要求的顺序重新加载InnoDB表的操作,非常有用;
③ 将foreign_key_checks设置为0还会影响数据定义语句:
◇ DROP SCHEMA能够删除一个数据库,即使该数据库包含了具有被其它数据库中的表所引用的外键的表;
◇ 而DROP TABLE能够删除具有被其它表所引用的外键的表;
④ 将foreign_key_checks设置为1不会触发对现有表数据的扫描。因此,在foreign_key_checks=0时添加到表中的行将不会被验证以保持数据一致性;
⑤ 使用foreign_key_checks=0,删除外键约束所需的索引会使表处于不一致的状态,并导致在表加载时发生的外键检查失败。为了避免这个问题,请在删除索引之前先删除外键约束;
6. log_output
功能:决定通用查询日志和慢查询日志的输出位置
取值:TABLE(输出到表),FILE(默认值,输出到文件),NONE(不输出,优先级高),以逗号分隔的关键字列表
说明:
①log_output = NONE时,通用查询日志和慢查询日志无论是否开启,均不起作用
②FILE的性能优于TABLE
类型:全局系统变量
设置:set log_output = FILE;
5. slow_query_log
功能:开启/关闭慢查询日志
取值:0关闭,1开启
类型:全局系统变量
设置:set slow_query_log = 1;
说明:慢查询日志起作用的前提是,log_output全局系统变量为FILE
4. innodb_buffer_pool_instances
3. innodb_file_per_table
功能:对后续新创建的InnoDB表,使用的表空间类型为FILE_PER_TABLE
取值:0开启,1关闭
作用域:全局
类型:动态变量,随时设置随时生效
设置:set global innodb_file_per_table = 1;
说明:
开启该设置后,后续新创建的InnoDB表,其索引和数据,放入自己的表空间,即对应数据库目录下的同名.ibd文件。
关闭该设置后,新表的索引和数据,放入系统表空间,即顶层数据目录下的ibdata文件。
好处:
1.
2. wait_timeout
功能:决定超时时间
作用域:全局和会话
类型:动态变量,随时设置随时生效
取值:[1, 31536000],单位秒,跨度:1秒——1年,系统默认值28800(8小时)
说明:
存在一个全局wait_timeout,每个连接又有各自的wait_timeout、是为会话级wait_timeout。
会话级wait_timeout在连接建立时被初始化,初始值由client连接类型决定:
连接选项包含CLIENT_INTERACTIVE,由全局interactive_timeout初始化,如navicat premium的命令行界面;
否则,由全局wait_timeout初始化,如mysql-connector/c++的Connection* sql::Driver::connect()
设置:
set global wait_timeout = n1;
set session wait_timeout = n2;
设置全局级wait_timeout对当前会话级wait_timeout无任何影响,当前会话级wait_timeout已在连接建立时初始化。该设置对后续新建连接的会话级wait_timeout的影响取决于client的连接类型。如果想改变当前会话级wait_timeout,需要显示调用语句二。
查看:
show global variables like "wait_timeout";
show session variables like "wait_timeout";
1. innodb_flush_log_at_trx_commit
功能:决定log buffer写入log file最后刷到磁盘的时机
影响:insert操作的速度
取值:0, 1, 2
0——每秒写入一次,伴随着刷新一次
1——每当有事物提交,即写入一次刷新一次
2——每当有事物提交,即写入一次,刷新为每秒一次
作用域:全局
类型:动态变量,随时设置随时生效
设置:set global innodb_flush_log_at_trx_commit = 0;
说明:设置成功后,所有会话均受影响;MySQL重启后,该变量由配置文件初始化,默认为1
安全性:1 > 2 > 0
进程mysqld崩溃,type0一秒内的事物全丢;
操作系统崩溃或意外断电,type2一秒内的事物全丢;
type1符合ACID,安全级别最高。
测试
表结构:
测试工具:mysqlslap
测试条件:单用户执行1000次insert,insert内容相同。
结果:speed0 = 2 * speed2 = 8 * speed1