mysql参数配置详解
【规范2】数据库管理规范
一、安装部署规范
单机+主从+集群(建议8.0版本用InnoDB Cluster) 后续完善
二、参数配置
#*** Client Options相关选项 ***#
#以下选项会被MySQL客户端应用读取,即MySQL附带的客户端应用程序可以读取。
[client]
port=3306
socket=/data/mysql57/socket/mysql.sock
[mysql]
prompt="\\u@\\h :\\d \\R:\\m:\\s>" 设置命令行提示符
no-auto-rehash 确保数据库服务启动得比较快,数据库有许多表,列有很多列.命令行mysql客户端连接需要很长时间,除非使用-A
[mysqld]
user=mysql
port=3306
server-id=13306 数据库唯一序号,建议ip最后一位+端口号
basedir=/usr/local/mysql57
datadir=/data/mysql57/data
tmpdir=/data/mysql57/tmp 此目录被 MySQL用来保存临时文件.例如,它被用来处理基于磁盘的大型排序,和内部排序一样,以及简单的临时表。
socket=/data/mysql57/socket/mysql.sock
pid-file=hostname.pid
slave_load_tmpdir=/path/tmp 全局静态参数,默认/tmp。当slave执行load data infile 时用。
character-set-server=utf8mb4 全局会话级动态参数,5.7默认为latin1,8.0默认为utf8mb4。服务器的默认字符集。建议使用utf8mb4,为utf8的超集。
default_time_zone="+8:00" 设置默认服务器时区。此选项设置全局time_zone系统变量。如果未设置,则默认时区与系统时区相同(为system_time_zone系统变量的值)。如果MySQL数据库主要运行在境外,请务必根据实际情况调整本参数。system_time_zone=CST,CST被视为美国、澳大利亚、古巴或中国的标准时间。GMT被视为世界时UT, 即格林尼治平太阳时间,指格林尼治所在地的标准时间。
open_files_limit=65535 全局静态参数,默认值5000。用于mysqld可打开的文件描述符的数量。如果无法分配请求的文件描述符数量,mysqld将警告写入错误日志,mysqld报错Too many open files,应该尝试增大该值。当open_files_limit没有被配置的时候,比较max_connections*5和ulimit-n的值,哪个大用哪个,当open_file_limit被配置的时候,比较open_files_limit和max_connections*5的值,哪个大用哪个。最大值取决于系统配置,在Unix上,该值不能设置为大于ulimit -n。在/etc/security/limits.conf配置MySQL打开的文件数。
transaction_isolation=REPEATABLE-READ 全局会话级动态参数,默认为RR。设定默认的事务隔离级别.可用的级别如下:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ,SERIALIZABLE.1.READ UNCOMMITTED-读未提交 2.READ COMMITTE-读已提交 3.REPEATABLE READ-可重复读 4.SERIALIZABLE-串行。
lower_case_table_names=1 全局静态参数,默认为2。设置为0,则按指定存储表名,并且区分大小写。设置为1,则表名以小写形式存储在磁盘上,并且不区分大小写。设置为2,则表名按给定方式存储,但以小写形式进行比较。此选项也适用于数据库名称和表别名。
lower_case_file_system=ON 全局静态参数。描述了数据目录所在文件系统上文件名的大小写敏感性。OFF表示文件名区分大小写,ON表示它们不区分大小写。该变量是只读的,因为它反映了文件系统属性,并且设置它不会对文件系统产生影响。为只读参数,不允许修改。
#*** Skip Options相关选项 ***#
skip_name_resolve=on 全局静态参数,默认值为OFF。该变量是根据 --skip-name-resolve选项的值设置的。如果是OFF,mysqld在检查客户端连接时解析主机名。如果是ON,mysqld只使用IP号码;在这种情况下,Host授权表中的所有列值必须是IP地址或localhost。
skip-external-locking=on 全局静态参数,默认为on。不使用系统锁定,要使用 myisamchk,必须关闭服务器 ,避免 MySQL的外部锁定,减少出错几率增强稳定性。
skip-networking=off 全局静态参数。开启该选项可以彻底关闭 MySQL 的 TCP/IP 连接方式,如果 WEB 服务器是以远程连接的方式访问 MySQL 数据库服务器则不要开启该选项!否则将无法正常连接! 如果所有的进程都是在同一台服务器连接到本地的 mysqld, 这样设置将是增强安全的方法
#*** 系统资源相关选项 ***#
back_log=1024 全局静态参数,默认值-1。在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。如果MySql的连接数达到max_connections时,新来的请求将会被存在堆栈中,以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log,将不被授予连接资源。将会报:unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待连接进程时.back_log值不能超过TCP/IP连接的侦听队列的大小。若超过则无效,查看当前系统的TCP/IP连接的侦听队列的大小命令:cat /proc/sys/net/ipv4/tcp_max_syn_backlog,目前系统为1024。对于Linux系统推荐设置为大于512的整数。修改系统内核参数,可以编辑/etc/sysctl.conf去调整它。如:net.ipv4.tcp_max_syn_backlog = 2048,改完后执行sysctl -p 让修改立即生效。
max_connections=1000 全局动态参数,默认值151。同时连接到数据库服务器允许的最大客户端进程连接数。有Too Many Connections 的错误提示,则需要增大此值。达到max_connections限制而被拒绝的连接,会增加Connection_errors_max_connections状态变量。mysqld实际上允许max_connections+1客户端连接。给具有特权的账号保留了一个连接,用于超过max_connections参数限制后,还可以连接数据库进行SHOW PROCESSLIST,排查问题。
max_connect_errors=1000000 全局动态参数,默认100。如果来自主机的连续连接请求超过此数量而没有成功连接而中断,则服务器会阻止该主机进一步连接。可以通过刷新主机缓存来解除阻塞的主机。如果max_connect_errors 在前一个连接中断后的几次尝试中成功建立连接,则主机的错误计数清零。但是,一旦主机被阻塞,刷新主机缓存是解除阻塞的唯一方法,执行FLUSH HOSTS语句或执行mysqladmin flush-hosts 命令。
max_user_connections=1000 全局会话级动态参数,默认值为0。每个用户的最大的进程连接数。值0表示“没有限制”。
table_open_cache 全局动态参数,默认值2000。所有线程能打开的表数。如果show global status like 'Opened_tables'值很大,且不经常使用flush tables操作(只会强制关闭并重新打开所有表),则需要增加table_open_cache的值。
table_definition_cache 全局动态参数,默认值为-1,最小是为400。是.frm文件在定义换成里面存储的总量,如果你创建一个比较大的值,会加快你打开表的速度。这个表定义缓存会占据一些空间,它不同于常规的表缓存,它不会用文件描述符。它的值,最小400,之后一般依据下面的简单计算来定:400+(table_open_cache/2)
table_open_cache_instances 全局静态参数,默认16,最小1,最大64。打开的表缓存实例的数量。为了通过减少会话之间的争用来提高可伸缩性,可以将打开的表缓存划分为几个大小为 table_open_cache/table_open_cache_instances的较小缓存实例。一个会话只需要锁定一个实例就可以访问DML语句。这对实例之间的缓存访问进行分段,从而在有许多会话访问表时为使用缓存的操作提供更高的性能。(DDL语句仍然需要锁定整个缓存,但此类语句的频率远低于DML语句。)对于通常使用 16 个或更多内核的系统,建议使用 8 或 16 的值。
MySQL默认的table_open_cache为64,这个数值是偏小的,如果max_connections较大,则容易引起性能问题。
表现:数据库查询效率慢,show processlist 发现比较多的查询正在opening table。
进一步确认,执行以下语句:
> show global status like 'open%tables%';
Opened_tables数值非常大,说明cache太小,导致要频繁地open table,可以查看下当前的table_open_cache设置
> show variables like '%table_open_cache%';
默认是64,一般设置为max_connections就没问题了(如果还不够,可以继续加大,但不能设置大得离谱,可能会引发其他问题)。4G内存的机器,建议设置为2048
> set global table_open_cache=2048;
Query OK, 0 rows affected (0.00 sec)
设置后可以观察一下,如果opening table不再怎么出现,说明此修改是有效的,将其添加到mysql的配置文件,这样数据库重启后仍可保留此设置。
> show variables like '%table_open_cache%';
比较适合的值:
Open_tables/Opened_tables>=0.85
Open_tables/table_open_cache<=0.95
thread_stack 全局静态参数,默认值262144为256kb。每个线程的堆栈大小,对于正常操作来说足够大了。如果线程堆栈大小太小,则会限制服务器可以处理的SQL语句的复杂性、存储过程的递归深度以及其他消耗内存的操作。
external-locking=FALSE 默认FALSE。禁用外部锁定(系统锁定),只会影响MyISAM表访问。如果开启会使mysqld很容易死锁。要显式禁用外部锁定,可以使用 --skip-external-locking.
max_allowed_packet=64M 全局会话级动态参数,默认值为4MB,最大值为1GB,设置值必须为1024的倍数。设置在网络传输中一次消息传输量的最大值。net_buffer_length和max_allowed_packet都以给出的大小开始,每个SQL语句的net_buffer_length根据需要动态放大到max_allowed_packet的值,结果缓冲区缩小到net_buffer_length的值。此参数值不用配置,连接缓冲区会自动扩大,在会话级别是只读的。如果使用大BLOB列或长字符串,则必须增加此值,应该与BLOB使用的最大值一样大,避免MySQL客户端或mysqld服务器收到大于 max_allowed_packet 字节的信息包时,报“信息包过大”错误,并关闭连接。对于某些客户端,如果通信信息包过大,在执行查询期间,可能会遇到“丢失与 MySQL 服务器的连接”错误。当通过更改max_allowed_packet变量的值来更改消息缓冲区大小时,如果客户端程序允许,还应该在客户端更改缓冲区大小。客户端库中内置的默认max_allowed_packet值为1GB,但个别客户端程序可能会覆盖此值。例如,mysql和mysqldump的默认值分别为16MB和24MB。可以在命令行或选项文件中更改客户端max_allowed_packet的值。此变量在会话级别是只读的,客户端最多可以接收与会话值一样多的字节。但是,服务器不会向客户端发送比当前全局max_allowed_packet值更多的字节。注:如果客户端连接后更改全局值,则全局值可能小于会话值。
sort_buffer_size=4M 全局会话级动态参数,不限定存储引擎,默认值256KB。查询排序时所能使用的缓冲区大小。通过SHOW GLOBAL STATUS,如果Sort_merge_passes的值很大,可以增大sort_buffer_size参数值,以加快ORDER BY或GROUP BY在无法通过查询优化或改进索引来优化的操作。在排序发生时会分配给每个线程,由于该参数对应的分配内存是每个连接独占,过大的设置+高并发可能会耗尽系统内存资源。如果有500个连接,那么实际分配的总共排序缓冲区大小为500×4=2GB,所以该参数值并不是越大越好。
join_buffer_size=4M 全局会话级动态参数。用于普通索引扫描、范围索引扫描和不使用索引并因此执行全表扫描的连接的缓冲区的最小大小,该参数对应的分配内存也是每个连接独享。此缓冲被用来优化全联合(full JOINs 不带索引的联合),类似的联合在极大多数情况下的性能非常糟糕, 但是将此值设大能够减轻性能影响。可以通过Select_full_join状态变量查看全联合的数量。
thread_cache_size 全局动态参数。服务器中可以重新利用保存在缓存中线程的数量。当客户端断开连接时,如果客户端的线程少于缓存中的线程,则将客户端的线程放入缓存中thread_cache_size。通过重用从缓存中获取的线程来满足对线程的请求,并且只有当缓存为空时才会创建新线程。如果有很多新连接,可以增加此变量以提高性能。如果服务器每秒看到数百个连接,通常应该调整thread_cache_size值足够高,以便于大多数新连接都使用缓存线程。通过比较Connections和Threads_created状态的变量,查看线程缓存的效率。默认值参考,上限为100:8+(max_connections/100)根据物理内存设置规则如下:1G—>8/2G—>16/3G—>32/大于3G—>64
interactive-timeout 全局会话级动态参数,默认值28800s为8小时。服务器在关闭交互式连接之前等待其活动的秒数。如果前端程序采用短连接,建议缩短wait_timeout和interactive_timeout值, 如果前端程序采用长连接,可直接注释掉这两个参数,默认配置(8小时)
wait_timeout=600 全局会话级动态参数,默认值28800s为8小时。服务器在关闭非交互式连接之前等待其活动的秒数。在线程启动时,会话wait_timeout初始值从全局interactive_timeout值获取。
lock_wait_timeout=3600 全局会话级动态参数,默认值为31536000s(1 年)。此变量指定尝试获取元数据锁的超时时间(以秒为单位),允许值范围为1到31536000。此超时适用于所有使用元数据锁的语句。这些包括DML和DDL操作对表、视图、存储过程和函数,以及LOCK TABLES,FLUSH TABLES WITH READ LOCK和HANDLER语句。
connect_timeout=10 全局动态参数,默认值是10s。连接超时之前的最大秒数,在 Linux 平台上,该超时也用作等待服务器首次回应的时间。如果客户经常遇到Lost connection to MySQL server at 'XXX', system error: errno,可以增加connect_timeout的值。连接超时之前的最大秒数,在 Linux 平台上,该超时也用作等待服务器首次回应的时间。
#*** tmp && heap settings相关选项 ***#
tmp_table_size 全局会话级动态参数,默认值16M。内部内存临时表的最大大小,如果超过该值,则结果放到磁盘中,此限制是针对单个表的,而不是总和。实际由tmp_table_size和max_heap_table_size中较小的值确定。如果内存中的临时表超出限制,MySQL会自动将其转换为磁盘上的临时表。如果执行许多高级GROUP BY查询,并且有大量内存,增加tmp_table_size和max_heap_table_size的值。通过比较Created_tmp_disk_tables和Created_tmp_tables变量的值,确定tmp_table_size设置的是否合理。
max_heap_table_size 全局会话级动态参数,默认值16M。独立的内存表所允许的最大容量,此选项为了防止意外创建一个超大的内存表导致用尽所有的内存资源。
#*** log settings 相关选项 ***#
log_timestamps=SYSTEM 全局动态参数,默认值UTC。控制写入错误日志的消息中时间戳的时区,以及写入文件的一般查询日志和慢速查询日志消息。不影响一般查询日志和慢查询日志消息写入表的时区(mysql.general_log, mysql.slow_log)。
log-bin=/path/logs/mysql-binlog 全局静态参数。打开二进制日志功能,在复制(replication)配置中,作为MASTER主服务器必须打开此项。如果需要从最后的备份中做基于时间点的恢复,也同样需要二进制日志。默认在datadir下。这样设置后相当于,制定了log_bin_basename和log_bin_index的配置。
log_slave_updates=1 全局静态参数,默认false。表示slave将从主服务器接收到的复制事件写进自己的二进制日志,必须在从属设备上启用二进制日志记录才能使此变量生效。
relay-log 全局静态参数,文件名。定义relay_log的位置和名称,如果值为空,则默认位置在数据文件的目录,文件名为host_name-relay-bin.nnnnnn
relay_log_index 全局静态参数,文件名。如果为空,则默认位置在数据文件的目录。
log_error_verbosity 全局动态参数,默认值为2。1在错误日志中记录ERROR,2记录ERROR,WARNING,3记录ERROR,WARNING,INFORMATION。从MySQL5.7.2开始,log_error_verbosity系统变量优先于并且应该代替--log-warnings选项或log_warnings系统变量使用。
log-error=/path/data/error.log 全局静态参数,文件名。记录错误日志的路径。
slow_query_log=1 全局动态参数,默认值OFF。是否开启慢查询日志。慢查询是指执行时间超过long_query_time定义时间的查询。如果log_long_format被打开,那些没有使用索引的查询也会被记录。
long-query-time=0.1 全局会话级动态参数,默认值为10s。设定慢查询的阀值,超出次设定值的SQL即被记录到慢查询日志,同时会增加Slow_queries状态变量的值。不要设置为1, 否则会导致所有的查询,甚至非常快的查询也被记录下来。该值可以指定为微秒。
log_output=FILE 全局动态参数,默认值为FILE,可以为FILE和TABLE。指定了慢查询输出的格式,可以设置为TABLE,然后就可以查询mysql.slow_log表了。
slow_query_log_file=/path/slow.log 全局动态参数,文件名。指定慢日志文件存放位置,可以为空,系统会给一个缺省的文件host_name-slow.log
log-queries-not-using-indexes=1 全局动态参数,默认值OFF。启用慢查询日志的情况下启用此变量,会记录SQL语句没有使用索引的查询。此选项不一定意味着不使用索引,例如,使用全索引扫描的查询使用索引但会被记录,因为索引不会限制行数。
log_throttle_queries_not_using_indexes=60 全局动态参数,如果log_queries_not_using_indexes启用,该log_throttle_queries_not_using_indexes变量会限制每分钟可以写入慢查询日志的此类查询的数量。值0(默认值)表示“无限制”。
min_examined_row_limit=100 全局会话级动态参数,默认值为0。记录那些由于查找了多余1000次而引发的慢查询。
log_slow_admin_statements=on 全局动态参数,默认关闭。默认写入慢查询日志的语句中不包含管理语句,也不会记录不使用索引进行查找的查询。打开后会记录执行慢的管理语句,包括ALTER TABLE、 ANALYZE TABLE、 CHECK TABLE、 CREATE INDEX、 DROP INDEX、 OPTIMIZE TABLE和 REPAIR TABLE。
log_slow_slave_statements=on 全局动态参数,默认关闭。此变量会启用日志记录在从属服务器上执行时间超过主库定义long_query_time几秒的查询,变量的状态适用于所有后续启动START SLAVE之后的语句。需要注意,所有以行格式记录在master中的语句都不会记录在slave的慢日志中,即使log_slow_slave_statements已启用。
log_queries_not_using_indexes=on 全局动态参数,默认关闭。开启后会把不使用索引的查询记录到慢查询日志中。
sync_binlog=1 全局动态参数,默认值为1。控制MySQL服务器将二进制日志同步到磁盘的频率。sync_binlog=0:禁用MySQL服务器将二进制日志同步到磁盘。相反,MySQL服务器依赖操作系统不时将二进制日志刷新到磁盘,就像它对任何其他文件所做的那样。此设置提供了最佳性能,但如果发生电源故障或操作系统崩溃,服务器可能已提交尚未同步到二进制日志的事务。sync_binlog=1:在提交事务之前启用二进制日志到磁盘的同步。这是最安全的设置,但由于磁盘写入次数增加,可能会对性能产生负面影响。在电源故障或操作系统崩溃的情况下,二进制日志中丢失的事务仅处于准备状态。这允许自动恢复例程回滚事务,从而保证不会从二进制日志中丢失事务。sync_binlog=N, 其中是 0 或 1 以外的值:在收集到二进制日志提交组N后,将二进制日志同步到磁盘。N在电源故障或操作系统崩溃的情况下,服务器可能已经提交了尚未刷新到二进制日志的事务。由于磁盘写入次数增加,此设置可能会对性能产生负面影响。较高的值会提高性能,但会增加数据丢失的风险。
binlog_cache_size=4M 全局动态参数,默认值32KB。在一个事务中binlog为了记录SQL状态所持有的cache大小,如果经常使用大事务,可以增加此值来获取更大的性能。事务中的状态都将被缓冲在binlog缓冲中,然后在提交后一次性写入到binlog中,如果事务比此值大, 会使用磁盘上的临时文件来替代。此缓冲在每个连接的事务第一次更新状态时在session级别被创建。可以结合Binlog_cache_use和Binlog_cache_disk_use参数的值,调整此变量的大小。binlog_cache_size仅设置事务缓存的大小;语句缓存的大小由binlog_stmt_cache_size系统变量控制。
max_binlog_cache_size=2G 全局动态参数。如果一个事务需要超过这么多字节的内存,服务器会生成一个多语句事务需要超过'max_binlog_cache_size'字节的存储错误。最小值为 4096。可能的最大值为 16EB。最大推荐值为4GB,这是因为MySQL目前无法处理大于4GB的二进制日志。max_binlog_cache_size仅设置事务缓存的大小,语句缓存的上限由max_binlog_stmt_cache_size系统变量控制。在MySQL 5.7中,max_binlog_cache_size对会话的可见性与binlog_cache_size系统变量的可见性相匹配,换句话说,更改其值只会影响值更改后启动的新会话。
max_binlog_size=1G 全局动态参数,默认值1073741824为1GB。如果二进制日志写入的内容超出给定值,日志就会发生滚动。该值不能大于1GB或小于4096字节。如果正使用大的事务,二进制日志还会超过max_binlog_size。如果写入二进制日志导致当前日志文件大小超过此变量的值,则服务器轮换二进制日志(关闭当前文件并打开下一个文件)。最小值为 4096 字节。最大值和默认值为 1GB。加密的二进制日志文件有一个额外的512字节标头,包含在max_binlog_size。如果max_relay_log_size为0,则该值max_binlog_size也适用于中继日志。开启GTID,当max_binlog_size被用完,如果无法访问系统表mysql.gtid_executed,把当前的GTID信息写入二进制日志文件,则无法切换二进制日志。在这种情况下,服务器会根据其binlog_error_action设置做出响应。如果设置为IGNORE_ERROR,则在服务器上记录错误并停止二进制日志记录,如果设置为ABORT_SERVER,则服务器会关闭。
secure-file-priv=/path/tmp 全局静态参数。此变量用于限制数据导入和导出操作的影响,例如由 LOAD DATA and SELECT ... INTO OUTFILE语句和LOAD_FILE()函数执行的操作。这些操作只允许有FILE权限的用户使用。secure_file_priv可以设置如下:如果为空,则变量无效。这不是一个安全的设置。如果设置为目录的名称,则服务器将导入和导出操作限制为仅处理该目录中的文件。目录必须存在;服务器不会创建它。如果设置为NULL,服务器将禁用导入和导出操作。服务器 secure_file_priv在启动时检查 的值,如果该值不安全,则将警告写入错误日志。如果非NULL值是空的,或者值是数据目录或其子目录,或者所有用户都可以访问的目录,则认为非值是不安全的。如果secure_file_priv设置为不存在的路径,则服务器将错误消息写入错误日志并退出。
expire_logs_days=30 全局动态参数。自动删除binlog的天数,8.0已弃用,由binlog_expire_logs_seconds代替。MySQL 8.0开始,binlog_expire_logs_seconds选项也存在的话,会忽略expire_logs_days选项
binlog_expire_logs_seconds 全局静态参数,默认值2592000秒,即30天。如果expire_logs_days和binlog_expire_logs_seconds在启动时有一个参数设置为非0,则该值决定二进制日志有效期,如果同时出现则binlog_expire_logs_seconds决定二进制日志有效期,如果未设置则用binlog_expire_logs_seconds的默认值为二进制日志有效期。
master_info_repository=TABLE 全局动态参数,5.7默认为FILE,8.0默认值为TABLE。该变量的设置决定了从服务器是将主状态和连接信息记录到系统数据库中mysql.slave_master_info表中,还是记录到数据目录中的文件中。在配置多个复制通道之前,必须设置此变量,只有在没有执行复制线程时才能更改此变量的值。
relay_log_info_repository=TABLE 全局动态参数,5.7默认为FILE,8.0默认值为TABLE。该变量的设置决定了从服务器是将其在中继日志中的位置记录到系统数据库中的mysql.slave_relay_log_info表中,还是记录到数据目录中的文件中。配置多个复制通道时需要设置。还需要中继日志信息日志的TABLE设置以使复制对意外停止具有弹性,为此还必须启用--relay-log-recovery选项。
relay_log_recovery=1 全局静态参数,默认5.7FALSE/8.0OFF关闭。在服务器启动后立即自动启用中继日志恢复。恢复进程创建一个新的中继日志文件,将SQL线程位置初始化为这个新的中继日志,并将I/O线程初始化为SQL线程位置,然后继续从主服务器读取中继日志。这个全局变量是只读的,可以通过使用该选项启动从属服务器来更改其值,该--relay-log-recovery选项应在复制从属服务器意外停止后使用,以确保不会处理可能损坏的中继日志。此变量还与relay-log-purge交互,后者控制在不再需要日志时清除日志。在禁用--relay-log-recovery选项时启用relay-log-purge可能会从未清除的文件中读取中继日志,从而导致数据不一致。当relay_log_recovery启用并且从属服务器由于在多线程模式下运行时遇到错误而停止时,可以使用START SLAVE UNTIL SQL_AFTER_MTS_GAPS确保在切换回单线程模式或执行CHANGE MASTER TO 语句之前处理所有间隙。
relay-log-purge=1 全局动态参数,默认启用。不再需要时立即禁用或者启用中继日志的自动清除。
gtid_mode=on 全局动态参数,默认关闭。此选项指定是否使用全局事务标识符(GTID) 来标识事务。将此选项设置为--gtid-mode=ON要求将enforce-gtid-consistency其设置为ON。记录的事务可以是匿名的或使用GTID。匿名事务依赖二进制日志文件和位置来识别特定事务。GTID事务具有用于引用事务的唯一标识符。不同的模式是:OFF: 新的和复制的事务都必须是匿名的。OFF_PERMISSIVE: 新交易是匿名的。复制的交易可以是匿名交易或 GTID 交易。ON_PERMISSIVE: 新交易是 GTID 交易。复制的交易可以是匿名交易或 GTID 交易。ON:新事务和复制事务都必须是 GTID 事务。从一个值到另一个值的更改一次只能是一个步骤。例如,如果 gtid_mode当前设置为 OFF_PERMISSIVE,则可以更改为 OFF或ON_PERMISSIVE但不能更改为ON。
enforce_gtid_consistency=1 全局动态参数,默认关闭。启用后,服务器通过只允许执行可以使用GTID安全记录的语句来强制执行GTID一致性。在启用基于GTID的复制之前,必须将--enforce-gtid-consistency选项设置为ON。可以配置的值为:OFF:允许所有事务违反 GTID 一致性。ON: 不允许任何事务违反 GTID 一致性。WARN:允许所有事务违反 GTID 一致性,但在这种情况下会生成警告。enforce_gtid_consistency开启时,只能记录可以使用GTID安全语句记录的语句,因此以下操作不能使用:CREATE TABLE ... SELECT statements。CREATE TEMPORARY TABLE 或 DROP TEMPORARY TABLEstatements 在事务内部。更新事务和非事务表的事务或语句。如果所有非事务性表都是临时的,则在与事务性DML相同的事务或同一语句中允许非事务性DML是一个例外。
slave-rows-search-algorithms='INDEX_SCAN,HASH_SCAN' 全局动态参数,在8.0.18弃用。在为基于行的日志记录和复制准备成批的行时,此选项控制如何搜索行以查找匹配项,散列是否用于使用主键或唯一键、其他键或不使用键的搜索全部。默认值为 TABLE_SCAN,INDEX_SCAN,这意味着所有可以使用索引的搜索都使用它们,而没有任何索引的搜索使用表扫描。
binlog_format=ROW 全局会话级动态参数,默认值为ROW,其他值ROW/STATEMENT/MIXED。MySQL复制主要有三种方式:基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),混合模式复制(mixed-based replication, MBR)。对应的,binlog的格式也有三种:STATEMENT,ROW,MIXED。STATEMENT模式(SBR)每一条会修改数据的sql语句会记录到binlog中。优点是并不需要记录每一条sql语句和每一行的数据变化,减少了binlog日志量,节约IO,提高性能。缺点是在某些情况下会导致master-slave中的数据不一致(如sleep()函数,last_insert_id(),以及user-defined functions(udf)等会出现问题)ROW模式(RBR)不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了,修改成什么样了。而且不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题。缺点是会产生大量的日志,尤其是alter table的时候会让日志暴涨。MIXED模式(MBR)以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式。
binlog_checksum=1 全局动态参数。启用后,会校验主服务器写入二进制日志中的每个事件。binlog_checksum支持值NONE(禁用)和CRC32,默认值为CRC32。不能在事务中更改binlog_checksum的值。当binlog_checksum禁用(值 NONE)时,服务器通过写入和检查每个事件的事件长度(而不是校验和)来验证它是否仅将完整事件写入二进制日志。更改此变量的值会切换二进制日志,导致校验总是写入整个二进制日志文件,而不是只写入其中的一部分。在主服务器上将此变量设置为从服务器无法识别的值会导致从服务器将自己的binlog_checksum值设置为NONE,并停止复制并出现错误。(Bug #13553750,Bug #61096)如果与旧从站的向后兼容性是一个问题,可能需要显式设置该值为NONE.
slow_launch_time 默认动态参数,默认值为2.如果创建线程花费的时间超过了这么多秒,服务器会增加show global status like 'Slow_launch_threads'状态变量。
general_log=0 全局动态参数,默认关闭。将所有到达MySQL Server的SQL语句记录下来。
general_log_file=/path/mysql.log 全局动态参数,文件名。general_log开启才能生效。
max_relay_log_size=1G 全局静态参数。服务器自动切换中继日志文件的大小。如果此值非零,则中继日志在其大小超过此值时自动切换。如果此值为零(默认值),则中继日志在达到max_binlog_size时发生切换。
relay-log-purge=1 全局动态参数,默认值为on。是否自动清空不再需要中继日志时。在启用该选项时禁用清除中继日志会导致数据一致性风险,因此不具备崩溃安全性。
binlog_stmt_cache_size 全局动态参数,默认32KB。二进制日志用于保存事务期间发出的非事务语句的内存缓冲区的大小。在服务器上启用二进制日志记录时(使用log_bin系统变量设置为ON),如果服务器支持任何事务存储引擎,则为每个客户端分配单独的二进制日志事务和语句缓存。如果事务中使用的非事务性语句的数据超出内存缓冲区中的空间,则超出的数据将存储在临时文件中。当服务器上的二进制日志加密处于活动状态时,内存缓冲区未加密,但(从 MySQL 8.0.17 开始)用于保存二进制日志缓存的任何临时文件都被加密。提交每个事务后,通过清除内存缓冲区并截断临时文件(如果使用)来重置二进制日志语句缓存。如果经常在事务期间使用大型非事务性语句,则可以通过减少或消除写入临时文件的需要来增加此缓存大小以获得更好的性能。查看Binlog_stmt_cache_use和Binlog_stmt_cache_disk_use状态,调整此变量的大小。
slave-net-timeout=60 全局动态参数,默认值60s为1分钟。在从服务器认为连接断开、中止读取并尝试重新连接之前等待来自主服务器更多数据的秒数。第一次重试在超时后立即发生。但是,只有从服务器超过slave_net_timeout秒没有从主服务器收到数据才通知网络中断。
net_read_timeout=30 全局会话级动态参数,默认30s。从服务器从主服务器读取信息的超时时间。
net_write_timeout=60 全局动态参数,默认值60s。从服务器写入信息的超时时间。
net_retry_count=10 全局会话级动态参数,默认值为10次。如果通信端口上的读取或写入中断,在放弃之前重试的次数。
net_buffer_length 全局会话级动态参数,默认值16KB,最大为1MB。每个客户端线程都与一个连接缓冲区和结果缓冲区相关联。两者都以给出的大小开始,每个SQL语句的net_buffer_length根据需要动态放大到max_allowed_packet的值,结果缓冲区缩小到net_buffer_length的值。此参数值不用配置,连接缓冲区会自动扩大,在会话级别是只读的。
#*** MyISAM 相关选项 ***#
key_buffer_size=32M 全局动态参数。MyISAM引擎表索引块缓冲区大小,增加它可得到更好的索引处理性能。如果是以InnoDB引擎为主的DB,key_buffer_size参数值可以设置较小,8MB已足够。如果是以MyISAM引擎为主,可设置较大,但不能超过4G。如果对表的顺序扫描请求非常频繁,并且认为频繁扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能。强烈建议不使用MyISAM引擎,默认使用InnoDB引擎,该参数值设置的过大反而会是服务器整体效率降低!
read_buffer_size=8M 全局会话级动态参数。MyISAM引擎表进行全表顺序扫描时分配的缓冲区大小。此变量的值应设置为4KB的倍数。
read_rnd_buffer_size=4M 全局会话级动态参数。MyISAM引擎表以索引扫描(Random Scan)方式扫描数据的buffer大小,多用于范围读取优化。当在排序之后,从一个已经排序好的序列中读取行时,行数据将从这个缓冲中读取来防止磁盘寻道。如果增高此值,可以提高很多ORDER BY操作的性能。
bulk_insert_buffer_size=64M 全局会话级动态参数。MyISAM用在块插入优化中的树缓冲区的大小。MyISAM引擎使用特殊的树状缓存来使得插入(INSERT … SELECT, INSERT … VALUES (…), (…), …, 以及 LOAD DATAINFILE) 更快地进行批量插入。此变量限制每个进程中缓冲树的字节数,设置为0会关闭此优化,为了最优化不要将此值设置大于key_buffer_size。
myisam_sort_buffer_size=128M 全局会话级动态参数。MyISAM 设置恢复表之时使用的缓冲区的大小,当在REPAIR TABLE或用CREATE INDEX创建索引或ALTER TABLE过程中排序MyISAM索引分配的缓冲区。
myisam_max_sort_file_size=10G 全局动态参数。MySQL在重建MyISAM索引时允许使用的临时文件的最大大小(在REPAIR TABLE、 ALTER TABLE或 期间LOAD DATA INFILE)。如果文件大小大于此值,则使用键缓存创建索引,这会更慢。该值以字节为单位。如果MyISAM索引文件超过此大小并且磁盘空间可用,则增加该值可能有助于提高性能。该空间必须在包含原始索引文件所在目录的文件系统中可用。
myisam_repair_threads=1 全局会话级动态参数,默认值为1。如果此值大于1,MyISAM则在此过程中并行创建表索引(每个索引在其自己的线程中)。如果一个表拥有超过一个索引,MyISAM可以通过并行排序使用超过一个线程去修复他们。这对于拥有多个CPU以及大量内存情况的用户,是一个很好的选择。
#*** INNODB 相关选项 ***#
innodb_file_per_table=1 全局动态参数,默认开启。InnoDB为独立表空间模式。InnoDB将每个新创建的表的数据和索引存储在单独的.ibd文件中,而不是系统表空间中。当这些表被删除或截断时,这些表的存储空间会被回收。此设置启用 InnoDB表 压缩等功能。通过ALTER TABLE操作会将InnoDB表从系统表空间移动到单个文件。
独立表空间优点:1.每个表都有自已独立的表空间。2.每个表的数据和索引都会存在自已的表空间中。
3.可以实现单表在不同的数据库中移动。4.空间可以回收(除drop table操作处,表空不能自已回收)
缺点:1.单表增加过大,如超过100G
结论:共享表空间在Insert操作上稍有优势。其它都没独立表空间表现好。当启用独立表空间时,请合理调整:innodb_open_files
innodb_open_files=65535 全局静态参数,默认值是300。限制Innodb能打开的表的数据,如果库里的表特别多的情况,请增加这个参数值。
innodb_buffer_pool_size=2G 全局静态参数,默认值128MB。InnoDB缓存表和索引数据的内存区域(包括数据页、索引页、插入缓存、锁信息、自适应哈希、数据字典信息)。当缓冲池的大小大于1GB时,设置innodb_buffer_pool_instances为大于1的值可以提高繁忙服务器上的可伸缩性。InnoDB使用一个缓冲池来保存索引和原始数据,设置越大,在存取表里面数据时所需要的磁盘I/O越少。在数据库专用服务器上,可以设置这个变量到服务器物理内存大小的70%-80%。配置缓冲池大小时请注意以下潜在问题,并准备好在必要时缩减缓冲池的大小。物理内存的竞争可能导致操作系统中的分页。InnoDB为缓冲区和控制结构保留额外的内存,因此分配的总空间大约比指定的缓冲池大小大 10%。缓冲池的地址空间必须是连续的,这在具有在特定地址加载的DLL的Windows系统上可能是一个问题。初始化缓冲池的时间大致与其大小成正比。在具有大型缓冲池的实例上,初始化时间可能很长。为了减少初始化时间,可以在服务器关闭时保存缓冲池状态并在服务器启动时恢复它。当增加或减少缓冲池大小时,操作是以块的形式执行的。块大小由innodb_buffer_pool_chunk_size配置选项定义,默认为 128 MB。缓冲池大小必须始终等于或倍数innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances。如果将缓冲池大小更改为不等于或倍数innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances的值,则缓冲池大小会自动调整为等于或倍数的值, 且不小于指定的缓冲池大小 innodb_buffer_pool_chunk_size*innodb_buffer_pool_instances。innodb_buffer_pool_size可以动态设置,可以在不重新启动服务器的情况下调整缓冲池的大小。可通过查看Innodb_buffer_pool_resize_status变量的状态,调整缓冲池大小。
innodb_buffer_pool_instances=4 全局静态参数,默认值为8。Innodb缓冲池划分 的区域数。对于具有数 GB 范围内缓冲池的系统,将缓冲池划分为单独的实例可以通过减少不同线程读取和写入缓存页面时的争用来提高并发性。使用散列函数将存储在缓冲池中或从缓冲池中读取的每一页随机分配给缓冲池实例之一。每个缓冲池管理自己的空闲列表、刷新列表、 LRU和所有其他连接到缓冲池的数据结构,并受到自己的缓冲池互斥体的保护。innodb_buffer_pool_size此选项仅在设置为1GB或更大时生效,总缓冲池大小在所有缓冲池中分配。为获得最佳效率,请指定innodb_buffer_pool_instances和innodb_buffer_pool_size的组合,以便每个缓冲池实例至少为1GB。
innodb_buffer_pool_load_at_startup=1 全局静态参数,默认开启。指定在MySQL服务器启动时,InnoDB缓冲池通过加载它在较早时间持有的相同页面来自动预热。通常与innodb_buffer_pool_dump_at_shutdown结合使用。
innodb_buffer_pool_dump_at_shutdown=1 全局动态参数,默认开启。指定是否在MySQL服务器关闭时记录缓存在InnoDB缓冲池中的页面,以缩短下次重启时的预热过程。innodb_buffer_pool_dump_pct选项定义要转储的最近使用的缓冲池页面的百分比。
innodb_buffer_pool_dump_pct=25 全局动态参数,默认25。定义要转储的最近使用的缓冲池页面的百分比。指定要读取和转储的每个缓冲池最近使用的页面的百分比。范围为1到100。例如,如果有4个缓冲池,每个缓冲池有100个页面,并且innodb_buffer_pool_dump_pct设置为25,则转储每个缓冲池中最近使用的25个页面。
innodb_data_file_path=ibdata1:1G;ibdata2:1G:autoextend 全局静态参数,默认ibdata1:12M:autoextend。InnoDB定义系统表空间数据文件的名称、大小和属性。InnoDB将数据保存在一个或者多个数据文件中成为表空间,如果只有单个盘保存的数据,一个自增文件就足够了。其他情况下,每个设备一个文件一般就可以了,也可以配置InnoDB来使用裸盘分区。对第一个系统表空间数据文件强制执行最小文件大小,以确保有足够的空间用于双写缓冲区页面:对于innodb_page_size=16KB或更小的值,最小文件大小为 3MB。对于innodb_page_size=32KB的值,最小文件大小为 6MB。对于innodb_page_size=64KB的值,最小文件大小为 12MB。InnoDB定义系统表空间数据文件的名称、大小和属性。autoextend默认增量为64MB,要修改增量,请更改innodb_autoextend_increment系统变量。
innodb_flush_log_at_trx_commit=1 全局动态参数,默认值1。控制事务日志从innodb log buffer写入到redo log中的频率。>0每向二进制日志文件写入N条SQL或者N个事务后,则把二进制日志文件的数据刷新到磁盘上。可以通过更改默认值来获得更好的性能,但随后可能会在崩溃中丢失多达一秒钟的事务。值为0时,由mysql的main_thread每秒将存储引擎log buffer中的redo日志写入到log file,并调用文件系统的sync操作,将日志刷新到磁盘。事务提交时不会执行从日志缓冲区到日志文件的写入。在这种情况下,MySQL性能最好。由于进程调度问题,不能保证每秒一次的刷新。由于刷新到磁盘操作大约每秒发生一次,因此任何mysqld进程崩溃都会丢失多达一秒钟的事务。值为1时,完全符合ACID要求。每次事务提交时,将存储引擎log buffer中的redo日志写入到log file,并调用文件系统的sync操作,将日志刷新到磁盘。这是最安全的配置,但由于每次事务都需要进行磁盘I/O,所以也最慢。值为2时,每次事务提交时,将存储引擎log buffer中的redo日志写入到log file,但并不会立即刷写到磁盘,由存储引擎的main_thread每秒将日志刷新到磁盘。由于进程调度问题,每秒一次的刷新不能保证每秒发生100%。刷新到磁盘操作大约每秒发生一次,因此可能会在操作系统崩溃或断电时丢失多达一秒钟的事务。InnoDB日志刷新频率由innodb_flush_log_at_timeout控制,允许将日志刷新频率设置为N秒(其中 N是1 … 2700,默认值为 1)。但是,任何 mysqld进程崩溃都可以抹掉多达N秒钟的事务。DDL更改和其他内部InnoDB活动会独立于设置innodb_flush_log_at_trx_commit刷新InnoDB日志。InnoDB无论innodb_flush_log_at_trx_commit设置如何,崩溃恢复都有效。事务要么完全应用,要么完全删除。InnoDB为了在与事务一起使用的复制设置中获得最大可能的持久性和一致性,请使用以下设置:sync_binlog=1 && innodb_flush_log_at_trx_commit=1,在mysqld 服务崩溃或者服务器主机crash的情况下,binary log只有可能丢失最多一个语句或者一个事务。但是都为1会导致频繁的IO操作,因此该模式也是最慢的一种方式。双1适合数据安全性要求非常高,而且磁盘IO写能力足够支持业务,比如订单,交易,充值,支付消费系统。双1模式下,当磁盘IO无法满足业务需求时,推荐的做法是innodb_flush_log_at_trx_commit=2 && sync_binlog=N(N为500 或1000)且使用带蓄电池后备电源的缓存cache,防止系统断电异常。
警告:许多操作系统和一些磁盘硬件欺骗了刷新到磁盘操作。他们可能会告诉mysqld已经发生了刷新,即使它还没有发生。在这种情况下,即使使用推荐的设置也无法保证事务的持久性,在最坏的情况下,断电可能会损坏InnoDB数据。在SCSI磁盘控制器或磁盘本身中使用电池支持的磁盘缓存可加快文件刷新速度,并使操作更安全。可以尝试禁用硬件缓存中磁盘写入的缓存。
innodb_log_buffer_size=32M 全局静态参数,默认值16MB。InnoDB用于写入磁盘上日志文件的缓冲区大小(以字节为单位)。当此值快满时, InnoDB将必须刷新数据到磁盘上。由于基本上每秒都会刷新一次,所以没有必要将此值设置的太大。大型日志缓冲区使大型事务无需在事务提交之前将日志写入磁盘即可运行。因此,如果有更新、插入或删除许多行的事务,则使日志缓冲区更大可以节省磁盘 I/O。
innodb_log_file_size=48M 全局静态参数,默认值48MB。在日志组中每个日志文件的大小,应该设置日志文件总合大小到缓冲池大小的25%~100%,来避免在日志文件覆写上不必要的缓冲池刷新行为。通常,日志文件的组合大小应该足够大,以便服务器可以消除工作负载活动的高峰和低谷,这通常意味着有足够的重做日志空间来处理超过一个小时的写入活动。该值越大,缓冲池中需要的检查点刷新活动就越少,从而节省磁盘 I/O。较大的日志文件也会使崩溃恢复更慢。如果innodb_dedicated_server启用,则 innodb_log_file_size如果未明确定义,则会自动配置该值。
innodb_log_files_in_group=2 全局静态参数,默认为2。日志组中的日志文件数。以循环方式写入文件。
#innodb_max_undo_log_size=1G 全局动态参数,默认值为1073741824字节(1024 MiB)。定义undo表空间的阈值大小。如果撤消表空间超过阈值,则可以在innodb_undo_log_truncate启用时将其标记为截断。
#innodb_purge_rseg_truncate_frequency 全局动态参数,默认128次。根据调用清除的次数定义清除系统释放回滚段的频率。在释放回滚段之前,无法截断undo表空间。通常,清除系统每调用128次清除就释放回滚段一次。默认值为128。减小此值会增加清除线程释放回滚段的频率。
#innodb_undo_directory=/path/data/undolog 全局动态参数。InnoDB创建undo表空间的路径。通常用于将undo日志放在不同的存储设备上。与innodb_rollback_segments和innodb_undo_tablespaces一起使用。没有默认值(它是NULL)。如果未指定路径,则会在MySQL数据目录中创建undo表空间。
#innodb_rollback_segments 全局动态参数,默认128。定义InnoDB使用undo回滚段的数。系统表空间总是分配一个回滚段,32个回滚段保留给临时表使用,并托管在临时表空间( ibtmp1)中。要为生成undo记录的数据修改事务分配额外的回滚段,必须将innodb_rollback_segments设置为大于33的值。如果配置单独的undo表空间,系统表空间中的回滚段将变为非活动状态。每个回滚段最多可以支持1023个数据修改的事务。当innodb_rollback_segments设置为32或更少时,InnoDB将一个回滚段分配给系统表空间,将32分配给临时表空间( ibtmp1)。当innodb_rollback_segments设置为大于32的值时,InnoDB将一个回滚段分配给系统表空间,将32分配给临时表空间( ibtmp1),并为undo表空间(如果存在)分配额外的回滚段。如果不存在撤消表空间,则会将额外的回滚段分配给系统表空间。尽管可以增加或减少InnoDB使用的回滚段的数量,但系统中物理存在的回滚段的数量永远不会减少。因此,可以从该参数的低值开始并逐渐增加它,以避免分配不需要的回滚段。默认值为128,这也是innodb_rollback_segments的最大值。
#根据您的服务器IOPS能力适当调整,一般配普通SSD盘的话,可以调整到10000-20000。配置高端PCIe SSD卡的话,则可以调整的更高,比如 50000-80000。
innodb_io_capacity=4000 全局动态参数,默认值200。该参数设置InnoDB后台任务每秒执行I/O操作数的上限,例如从缓冲池刷新页面和合并来自更改缓冲区的数据。该参数是限制所有缓冲池实例的总限制。刷新脏页时,限制在缓冲池实例之间平均分配。innodb_io_capacity应该设置为系统每秒大约可以执行的I/O操作数。理想情况下,将设置保持在尽可能低的水平,但不要太低以至于后台活动落后。如果该值太高,则会从缓冲池中删除数据并太快地插入缓冲区,从而无法为缓存提供显着优势。对于具有更高I/O速率的繁忙系统,可以设置更高的值以帮助服务器处理与高速率行更改相关的后台维护工作。通常,可以根据InnoDB用于I/O的驱动器数量来增加该值。例如,可以增加使用多个磁盘或固态磁盘(SSD)的系统的价值。对于低端SSD,默认设置200通常就足够了。对于更高端的总线连接SSD,请考虑更高的设置,例如 1000。对于具有单个5400RPM或7200RPM驱动器的系统,可以将值降低到100,它表示可用于执行约100IOPS的老一代磁盘驱动器的每秒I/O操作(IOPS)的估计比例。尽管可以指定一个非常高的值,但在实践中,比较大的值几乎没有任何好处。通常,不建议使用20000或更高的值,除非已证明较低的值不足以满足工作负载。调整innodb_io_capacity时考虑写入工作负载。具有大量写入工作负载的系统可能会受益于更高的设置。对于写入工作量较小的系统,较低的设置可能就足够了。可以设置innodb_io_capacity为100或更大的任何数字,最大由innodb_io_capacity_max定义。innodb_io_capacity可以在MySQL选项文件(my.cnf或)中设置或使用需要权限的语句my.ini动态更改。SET GLOBALSUPER innodb_flush_sync配置选项会导致innodb_io_capacity在检查点处发生的I/O活动突发期间忽略该设置。innodb_flush_sync默认启用。innodb_io_capacity_max=8000 全局动态参数,如果刷新活动落后,则可以以比InnoDB innodb_io_capacity变量定义的更高的每秒I/O操作(IOPS)速率更积极地刷新。innodb_io_capacity_max变量定义了在这种情况下后台任务执行的最大IOPS数。innodb_flush_sync=0 全局动态参数,默认开启。innodb_flush_sync的变量会导致在检查点发生的I/O活动突发期间忽略innodb_io_capacity设置。要遵守innodb_io_capacity设置定义的I/O速率,请禁用innodb_flush_sync。
innodb_flush_neighbors=0 全局动态参数,5.7默认为1,8.0默认为0。指定从InnoDB缓冲池中刷新页面是否也会刷新相同范围内的其他脏页面。设置为0禁用innodb_flush_neighbors相同范围内的脏页不会被刷新。设置1刷新相同范围内的连续脏页。设置为2会刷新相同范围内的脏页。innodb_write_io_threads=8/innodb_read_io_threads=8 全局静态参数,默认值4。innodb使用后台线程处理数据页上的读写I/O(输入输出)请求,根据服务器的CPU核数来更改,默认是4。这两个参数不支持动态改变,需要把该参数加入到my.cnf里,修改完后重启MySQL服务,允许值的范围从1-64。innodb_purge_threads=4 全局静态参数,默认为4。专门用于清除InnoDB操作的后台线程数。最小值1表示清除操作始终由后台线程执行,而不是作为主线程的一部分。在一个或多个后台线程中运行InnoDB清除操作有助于减少内部争用,提高可伸缩性。将该值增加到大于1会创建许多单独的清除线程,这可以提高对多个表执行DML操作的系统的效率。最大值为32。
innodb_page_cleaners=4 全局静态参数,默认为4。从缓冲池实例中清理刷新脏页的页面线程数。页面清理线程执行刷新列表和LRU刷新。当有多个页面清理线程时,每个缓冲池实例的缓冲池刷新任务被分派给空闲的页面清理线程。如果页面清理线程的数量超过缓冲池实例的数量,则innodb_page_cleaners自动设置为与innodb_buffer_pool_instances相同的值。如果工作负载在将脏页从缓冲池实例刷新到数据文件时受写入IO限制,并且系统硬件具有可用容量,则增加页面清理线程的数量可能有助于提高写入IO吞吐量。多线程页面清理器支持扩展到关闭和恢复阶段。innodb_max_dirty_pages_pct=75 全局动态参数,默认值75。innodb主线程刷新缓存池中的数据,使脏数据比例小于90%,这是一个软限制,不被保证绝对执行。
innodb_flush_method=O_DIRECT 全局静态参数。定义用于将数据刷新到InnoDB数据文件和日志文件的方法,这会影响I/O吞吐量。表空间总是使用双重写入刷新方法。innodb_flush_method参数的选项包括:fsync:InnoDB调用系统fsync()刷新数据和日志文件。fsync是默认设置。O_DSYNC:InnoDB用于O_SYNC打开和刷新日志文件,以及fsync()刷新数据文件。InnoDB不会直接使用O_DSYNC,因为在许多Unix上都存在问题。O_DIRECT:InnoDB使用O_DIRECT(或 directio()在 Solaris 上)打开数据文件,并用于fsync()刷新数据和日志文件。此选项在某些GNU/Linux版本、FreeBSD 和 Solaris 上可用。O_DIRECT_NO_FSYNC: InnoDB在刷新I/O期间使用O_DIRECT,但之后跳过系统对fsync()调用。此设置适用于某些类型的文件系统,但不适用于其他类型。例如,它不适合XFS。如果不确定使用的文件系统是否需要fsync(),例如保留所有文件元数据请O_DIRECT改用。如何设置innodb_flush_method取决于硬件配置和工作负载,会有不同的性能影响。对于特定配置进行基准测试,以决定使用哪个设置,或者是否保留默认设置。检查Innodb_data_fsyncs的状态变量,查看每个设置的调用总数。fsync()工作负载中读取和写入操作的混合会影响设置的执行方式。例如,在具有硬件RAID控制器和电池支持的写入缓存的系统上,O_DIRECT可以帮助避免InnoDB缓冲池和操作系统文件系统缓存之间的双重缓冲。在某些系统上InnoDB数据和日志文件位于SAN上,这是默认值,或者对于主要是语句O_DSYNC的读取繁重的工作负载可能更快。SELECT始终使用反映您的生产环境的硬件和工作负载测试此参数。
innodb_lru_scan_depth=4000 全局动态参数,默认1024。影响InnoDB缓冲池刷新操作的算法和启发式的参数。指定每个缓冲池实例,页面清理线程扫描的缓冲池LRU页面列表向下多远,以查找要刷新的脏页。这是每秒执行一次的后台操作。小于默认值的设置通常适用于大多数工作负载。远高于必要的值可能会影响性能。只有在典型工作负载下有备用I/O容量时才考虑增加该值。相反,如果写入密集型工作负载使I/O容量饱和,请减小该值,尤其是在缓冲池较大的情况下。在调整innodb_lru_scan_depth时,从一个低值开始并向上设置,目标是很少看到零空闲页面。此外,在更改缓冲池实例的数量时考虑调整innodb_lru_scan_depth,因为innodb_lru_scan_depth*innodb_buffer_pool_instances定义了页面清理线程每秒执行的工作量。
innodb_checksum_algorithm=crc32 全局动态参数,默认值为crc32。指定如何生成和验证存储InnoDB表空间在磁盘中的块。
innodb_lock_wait_timeout=10 全局会话级动态参数,默认值50。InnoDB事务在放弃之前等待行锁的时间秒数。尝试访问被另一个InnoDB事务锁定的行的事务在发出以下错误之前最多等待这么多秒以对该行进行写访问:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction对于高度交互的应用程序或OLTP系统,可能会降低此值,以快速显示用户反馈或将更新放入队列以供稍后处理。可以为长时间运行的后端操作增加此值,例如数据仓库中等待其他大型插入或更新操作完成的转换步骤。innodb_lock_wait_timeout仅适用于InnoDB行锁。MySQL表锁不会在InnoDB内部发生,并且此超时不适用于等待表锁。锁定等待超时值在启用时不适用于死锁,因为会立即检测死锁并回滚其中一个死锁事务。在禁用时,发生死锁时依赖于事务回滚。innodb_lock_wait_timeout可以在运行时使用SET GLOBALor SET SESSION语句设置。更改 GLOBAL设置需要SUPER特权并影响随后连接的所有客户端的操作。任何客户端都可以更改SESSION的innodb_lock_wait_timeout设置,仅影响该客户端。
innodb_rollback_on_timeout=1 全局静态参数,默认关闭。InnoDB默认情况下仅回滚事务超时的最后一条语句。如果--innodb_rollback_on_timeout指定,事务超时会导致InnoDB中止并回滚整个事务。
innodb_print_all_deadlocks=1 全局动态参数,默认关闭。启用此选项后,有关InnoDB用户事务中的所有死锁的信息都会记录在mysqld错误日志中。否则使用SHOW ENGINE INNODB STATUS命令只会看到最后一个死锁的信息。偶尔的 InnoDB 死锁不一定是问题,因为 InnoDB 会立即检测到情况并自动回滚其中一个事务。如果应用程序没有适当的错误处理逻辑来检测回滚并重试其操作,可以使用此选项来解决为什么会发生死锁。大量死锁可能表明需要对发出 DML 或 SELECT … FOR UPDATE 语句的多个表的事务进行重组,以便每个事务以相同的顺序访问表,从而避免死锁情况。innodb_online_alter_log_max_size=4G 全局动态参数,默认134217728字节128M。指定在InnoDB表的联机DDL操作期间使用临时日志文件大小的上限。每个正在创建的索引或正在更改的表都有一个这样的日志文件。此日志文件存储在DDL操作期间在表中插入、更新或删除的数据。临时日志文件会在需要时按innodb_sort_buffer_size的值进行扩展,直至达到innodb_online_alter_log_max_size指定的最大值。如果临时日志文件超出大小上限,则ALTER TABLE操作失败并回滚所有未提交的并发DML操作。因此,此选项的较大值允许在线DDL操作期间发生更多DML,但也会延长DDL操作结束时表被锁定以应用日志数据的时间段。innodb_stats_on_metadata=0 全局动态参数,默认关闭。此选项仅适用于将优化器统计信息配置为非持久性的情况。当禁用innodb_stats_persistent或使用STATS_PERSISTENT=0创建或更改单个表时,优化器统计信息不会持久保存到磁盘。当innodb_stats_on_metadata启用时,当元数据语句show table status或者访问INFORMATION_SCHEMA.TABLES或INFORMATION_SCHEMA.STATISTICS表时(这些更新类似于ANALYZE TABLE发生的情况)InnoDB更新非持久统计信息。当关闭时,InnoDB在这些操作期间不会更新统计信息。禁用该设置可以提高具有大量表或索引的模式的访问速度。它还可以提高涉及 InnoDB 表的查询的执行计划的稳定性。要更改设置,请执行语句 SET GLOBAL innodb_stats_on_metadata=ON1|OFF0。更改设置需要SUPER权限并立即影响所有连接的操作。
innodb_undo_log_truncate=on 全局动态参数,默认关闭。启用后,超过定义的阈值的undo表空间将innodb_max_undo_log_size标记为截断。只有撤消表空间可以被截断。不支持截断驻留在系统表空间中的撤消日志。要发生截断,必须至少有两个undo表空间和两个重做的undo日志被配置。意味着innodb_undo_tablespaces必须设置为等于或大于2的值,并且innodb_rollback_segments必须设置为等于或大于35的值。innodb_purge_rseg_truncate_frequency配置选项可用于加快撤消表空间的截断。
internal_tmp_disk_storage_engine=InnoDB 全局动态参数,默认为InnoDB,8.0.16开始删除该选项。磁盘内部临时表的存储引擎为InnoDB引擎。使用internal_tmp_disk_storage_engine=INNODB时,生成超出InnoDB行或列限制的磁盘内部临时表的查询将返回Row size too large或Too many columns错误。解决方法是设置internal_tmp_disk_storage_engine=MYISAM。
#注意: 开启 innodb_status_output & innodb_status_output_locks 后, 可能会导致log-error文件增长较快
innodb_status_output=0 全局动态参数,默认关闭。启用或禁用标准InnoDB监视器的定期输出。还与innodb_status_output_locks结合使用以启用或禁用InnoDB锁定监视器的定期输出。innodb_status_output_locks=1 全局动态参数,默认关闭。启用或禁用InnoDB锁定监视器。启用后,InnoDB锁定监视器会在SHOW ENGINE INNODB STATUS输出中打印有关锁定的附加信息,并在定期输出中打印到MySQL错误日志。InnoDB锁定监视器的定期输出作为标准InnoDB监视器输出的一部分打印。因此,InnoDB必须启用标准监视器才能使InnoDB Lock Monitor定期将数据打印到MySQL错误日志。
innodb_sort_buffer_size=67108864 全局静态参数,默认1048576字节为1M。指定在创建InnoDB索引期间用于对数据进行排序的排序缓冲区的大小。指定的大小定义了读入内存进行内部排序然后写出到磁盘的数据量。这个过程被称为“运行”。在合并阶段,读取和合并指定大小的缓冲区对。设置越大,运行和合并的次数就越少。该排序区域仅用于索引创建期间的合并排序,而不是在以后的索引维护操作期间。当索引创建完成时,缓冲区被释放。
innodb_autoinc_lock_mode=1 全局静态参数,默认值5.7版本为1,8.0版本为2。0:“传统”锁定模式。在这种锁定模式下,所有“ INSERT-like ”语句都会获得一个特殊的表级AUTO-INC锁定,用于插入到具有AUTO_INCREMENT列的表中。此锁通常保持到语句的末尾(而不是事务的末尾),以确保为给定的语句序列以可预测和可重复的顺序分配自动递增值INSERT ,并确保自动递增值任何给定语句分配的都是连续的。1:“连续”锁定模式。在这种模式下,“批量插入”使用特殊的AUTO-INC表级锁并持有它直到语句结束。这适用于所有INSERT … SELECT、 REPLACE … SELECT和LOAD DATA语句。一次只能执行一个持有AUTO-INC锁的语句。如果批量插入操作的源表与目标表不同,则AUTO-INC在对源表中选择的第一行进行共享锁之后,再对目标表进行锁定。如果批量插入操作的源和目标是同一个表,则AUTO-INC在所有选定行上获取共享锁后获取锁。2:“交错”锁定模式。在这种锁模式下,没有 “ INSERT-like ” 语句使用表级AUTO-INC锁,可以同时执行多条语句。这是最快且最具可扩展性的锁定模式,但 在使用基于语句的复制或恢复方案时从二进制日志重放SQL语句时,它是不安全的。在这种锁定模式下,自动递增值保证在所有并发执行 的“ INSERT-like ” 语句中是唯一的并且单调递增。但是,由于多个语句可以同时生成数字(即,数字的分配在语句之间交错),为任何给定语句插入的行生成的值可能不是连续的。如果唯一执行的语句是“简单插入”,其中要插入的行数是提前知道的,那么除了“混合模式插入”之外,为单个语句生成的数字中没有间隙。但是,当执行“批量插入”时,任何给定语句分配的自动增量值可能存在间隙。将自动增量与复制一起使用:如果使用基于语句的复制,请设置innodb_autoinc_lock_mode为0或1,并在主服务器及其从服务器上使用相同的值。innodb_autoinc_lock_mode如果使用=2(“ interleaved ”)或主从不使用相同锁定模式的配置,则不能确保从属上的自动增量值与主控上的值相同。如果使用基于行或混合格式的复制,所有自动增量锁定模式都是安全的,因为基于行的复制对 SQL 语句的执行顺序不敏感(并且混合格式使用基于行的对于基于语句的复制不安全的任何语句的复制)。批量插入的自动增量值的差距:innodb_autoinc_lock_mode设置为0(“传统”)或1(“连续”)时,任何给定语句生成的自动增量值都是连续的,没有间隙,因为表级AUTO-INC锁一直保持到语句结束,并且仅一次可以执行一个这样的语句。innodb_autoinc_lock_mode设置为2(“interleaved”)时,“bulk inserts”生成的自动增量值可能存在间隙,但前提是同时执行“INSERT-like”语句。
innodb_buffer_pool_chunk_size=128M 全局静态参数,默认值128MB。定义InnoDB缓冲池大小调整操作的块大小。允许在不重新启动服务器的情况下调整缓冲池的大小。为避免在调整大小操作期间复制所有缓冲池页面,该操作以 “块”执行。一个块中包含的页数取决于innodb_page_size的值。innodb_buffer_pool_chunk_size可以以1MB(1048576 字节)为单位增加或减少。innodb_buffer_pool_chunk_size更改值时适用以下条件:如果在缓冲池初始化时innodb_buffer_pool_chunk_size*innodb_buffer_pool_instances大于当前缓冲池大小,innodb_buffer_pool_chunk_size则截断为innodb_buffer_pool_size/innodb_buffer_pool_instances。缓冲池大小必须始终等于或数倍innodb_buffer_pool_chunk_size*innodb_buffer_pool_instances。如果更改innodb_buffer_pool_chunk_size, innodb_buffer_pool_size 会自动调整为等于或倍数innodb_buffer_pool_chunk_size*innodb_buffer_pool_instances且不小于当前缓冲池大小的值。调整发生在缓冲池初始化时。更改innodb_buffer_pool_chunk_size时应小心,因为更改此值会自动增加缓冲池的大小。在更改innodb_buffer_pool_chunk_size之前,计算它将产生的影响,innodb_buffer_pool_size以确保生成的缓冲池大小是可以接受的。为避免潜在的性能问题,块 (innodb_buffer_pool_size/innodb_buffer_pool_chunk_size)的数量不应超过1000。
innodb_page_size=16384 全局静态参数,默认值16KB。指定MySQL实例中所有表空间的页面大小。可以使用值4096/4k 8192/8k 16384/16k 32768/32k 65536/64k来指定页面大小。innodb_page_size只能在初始化MySQL实例之前配置,之后不能更改。如果未指定值,则使用默认页面大小初始化实例。在ROW_FORMAT=COMPRESSED时不支持设置为32KB或64KB。默认的16KB或更大的页面大小适用于广泛的工作负载,特别是涉及表扫描的查询和涉及批量更新的DML操作。对于涉及许多小写入的OLTP工作负载,较小的页面大小可能更有效,当单个页面包含许多行时,争用可能是一个问题。对于通常使用小块大小的SSD存储设备,较小的页面可能也很有效。使InnoDB页面大小接近存储设备块大小可以最大限度地减少重写到磁盘的未更改数据量。第一个系统表空间数据文件 ( ibdata1) 的最小文件大小因innodb_page_size值而异。
innodb_thread_concurrency=16 全局动态参数,默认为0。服务器有几个CPU就设置为几。InnoDB尝试将并发的操作系统线程数保持在InnoDB小于或等于此变量给定的限制内(InnoDB使用操作系统线程来处理用户事务)。一旦线程数达到此限制,额外的线程将被置于“先进先出”(FIFO)队列中以等待执行。等待锁的线程不计入并发执行的线程数。此变量的范围是0到1000。0(默认值)被解释为无限并发(不限制并发数),可以更好去发挥CPU多核处理能力来提高并发量。如果MySQL实例与其他应用程序共享CPU资源,工作负载或并发用户数量正在增长,请考虑设置此变量。最优值依赖于应用程序,硬件以及操作系统的调度方式和运行的MySQL版本。需要测试一系列值以确定提供最佳性能的设置。
innodb_flush_log_at_timeout=1 全局动态参数,默认为1,每秒一次。设置多少秒写入和刷新日志。innodb_flush_log_at_timeout允许增加刷新之间的超时时间,以减少刷新并避免影响二进制日志组提交的性能。
innodb_log_group_home_dir 全局静态参数,目录名。InnoDB重做日志文件的目录路径,其编号由innodb_log_files_in_group指定。如果不指定任何InnoDB日志变量,则默认在MySQL数据目录中创建名为ib_logfile0和ib_logfile1的两个文件。日志文件大小由innodb_log_file_size系统变量给出。可以将其指定到一个独立的硬盘上或者一个RAID1卷上来提高其性能。
innodb_force_recovery=1 全局静态参数,默认值为0,一般不调整。如果InnoDB表空间损坏, 设置此值为一个非零值可能导出业务表,从1开始并且增加此值直到能够成功的导出表。
innodb_fast_shutdown 全局动态参数,默认值为1。InnoDB关机模式。如果值为0,InnoDB则在关闭之前会进行慢速关闭、完全清除和更改缓冲区合并。如果值为1,则InnoDB在关机时跳过这些操作,该过程称为快速关机。如果值为2,则InnoDB刷新其日志并冷关机,就好像MySQL崩溃了:没有提交的事务丢失,但是崩溃恢复操作使下次启动需要更长的时间。在仍然缓冲大量数据的极端情况下,缓慢关闭可能需要几分钟甚至几小时。在MySQL主要版本之间升级或降级之前使用慢速关闭技术,以便在升级过程更新文件格式时做好所有数据文件的准备。在紧急情况或故障排除情况下使用innodb_fast_shutdown=2,以在数据存在损坏风险时获得绝对最快的关闭速度。
#*** performance_schema相关设置 ***#
performance_schema=1 全局静态参数,默认开启。是否启用性能模式,会在performance_schema数据库中记录相关的信息。
#*** innodb monitor相关设置 ***#
#innodb monitor 全局动态参数。启用InnoDB指标计数器。可以使用INFORMATION_SCHEMA.INNODB_METRICS表格查询计数器数据。配置在my.cnf中。
innodb_monitor_enable="module_innodb"
innodb_monitor_enable="module_server"
innodb_monitor_enable="module_dml"
innodb_monitor_enable="module_ddl"
innodb_monitor_enable="module_trx"
innodb_monitor_enable="module_os"
innodb_monitor_enable="module_purge"
innodb_monitor_enable="module_log"
innodb_monitor_enable="module_lock"
innodb_monitor_enable="module_buffer"
innodb_monitor_enable="module_index"
innodb_monitor_enable="module_ibuf_system"
innodb_monitor_enable="module_buffer_page"
innodb_monitor_enable="module_adaptive_hash"
[mysqldump]
quick 不要缓存结果,逐行打印。支持较大数据库的转储,在导出非常巨大的表时需要此项。
max_allowed_packet=32M 增加该变量的值十分安全,这是因为仅当需要时才会分配额外内存。例如,仅当发出长查询或mysqld必须返回大的结果行时mysqld才会分配更多内存。该变量之所以取较小默认值是一种预防措施,以捕获客户端和服务器之间的错误信息包,并确保不会因偶然使用大的信息包而导致内存溢出。如果使用大的BLOB值,而且未为mysqld授予为处理查询而访问足够内存的权限,也会遇到与大信息包有关的问题。如果怀疑出现了该情况,请尝试在mysqld_safe脚本开始增加ulimit -d 256000,并重启mysqld。
三、数据库对象命名规范
1、数据库对象
数据库对象是数据库的组成部分,常见的有以下几种: 表(Table )、索引(Index)、视图(View)、图表(Diagram)、缺省值(Default)、规则(Rule)、触发器(Trigger)、存储过程(Stored Procedure)、 用户(User)等。 命名规范是指数据库对象如数据库(SCHEMA)、表(TABLE)、索引(INDEX)、约束(CONSTRAINTS)等的命名约定。
2、数据库对象全局命名规范
1、命名使用具有意义的英文词汇,词汇中间以下划线分隔。
2、命名只能使用英文字母、数字、下划线,以英文字母开头。
3、避免用MySQL的保留字如:backup、call、group等,参考MySQL 5.7+的关键字和保留字。
4、所有数据库对象使用小写字母,实际上MySQL中是可以设置大小写是否敏感的,为了保证统一性,规范全部用小写字母。
3、数据库命名规范
1、数据库命名尽量不超过30个字符。
2、数据库命名一般为项目名称+代表库含义的简写,比如IM项目的工作流数据库,可以是 im_flow。
3、数据库创建时必须添加默认字符集和校对规则子句。默认字符集为UTF8。
4、命名应使用小写。
4、表命名规范
1、常规表表名以t_开头,t代表table的意思,命名规则即 t + 模块(包含模块含义的简写)+ 表(包含表含义的简写),比如用户模块的教育信息表:t_user_eduinfo。
2、临时表(RD、QA或DBA同学用于数据临时处理的表),命名规则:temp前缀+模块+表+日期后缀:temp_user_eduinfo_20210719。
3、备份表(用于保存和归档历史数据或者作为灾备恢复的数据)命名规则,bak前缀+模块+表+日期后缀:bak_user_eduinfo_20210719。
4、同一个模块的表尽可能使用相同的前缀,表名称尽可能表达含义。
5、多个单词以下划线 _ 分隔。
6、常规表表名不超过30个字符,temp表和bak表视情况而定,尽量简短为宜,命名应使用小写。
5、字段命名规范
1、字段命名需要表示其实际含义的英文单词或简写,单词之间用下划线 _ 进行连接,如 service_ip、service_port。
2、各表之间相同意义的字段必须同名,比如a表和b表都有创建时间,应该统一为create_time,不一致会很混乱。
3、多个单词以下划线 _ 分隔。
4、字段名尽量不超过30个字符,命名应该使用小写。
6、索引命名规范
1、唯一索引使用uni + 字段名 来命名
> create unique index uni_uid on t_user_basic(uid);
2、非唯一索引使用idx + 字段名 来命名
> create index idx_uname_mobile on t_user_basic(uname,mobile);
3、多个单词以下划线 _ 分隔。
4、索引名不超过50个字符,命名使用小写,组合索引的字段不宜太多,不然也不利于查询效率的提升。
5、多单词组成的列名,取尽可能代表意义的缩写,如 test_contact表member_id和friend_id上的组合索引:idx_mid_fid。
6、理解组合索引最左前缀原则,避免重复建设索引,如果建立了(a,b,c),相当于建立了(a), (a,b), (a,b,c)。
7、视图命名规范
1、视图名以v开头,表示view,完整结构是v+视图内容含义缩写。
2、如果视图只来源单个表,则为v+表名。如果视图由几个表关联产生就用v+下划线(_)连接几个表名,视图名不超过30个字符。
3、如无特殊需要,严禁开发人员创建视图。
4、命名应使用小写。
8、存储过程命名规范
1、存储过程名以sp开头,表示存储过程(storage procedure)。之后多个单词以下划线(_)进行连接。存储过程命名中应体现其功能。存储过程名不能超过30个字符。
2、存储过程中的输入参数以i_开头,输出参数以o_开头。
3、命名应使用小写。
> create procedure sp_multi_param(in i_id bigint,in i_name varchar(32),out o_memo varchar(100));
9、函数命名规范
1、函数名以func开始,表示function。之后多个单词以下划线(_)进行连接,函数命名中应体现其功能。函数名不超过30个字符。
2、命名应使用小写。
> create function func_format_date(ctime datetime)
10、触发器命名规范
1、触发器以trig开头,表示trigger 触发器。
2、基本部分,描述触发器所加的表,触发器名不超过30个字符。
3、后缀(_i,_u,_d),表示触发条件的触发方式(insert,update或delete)。
4、命名应使用小写。
> DROP TRIGGER IF EXISTS trig_attach_log_d;
> CREATE TRIGGER trig_attach_log_d AFTER DELETE ON t_dept FOR EACH ROW;
11、约束命名规范
1、唯一约束:uk_表名称_字段名。uk是UNIQUE KEY的缩写。比如给一个部门的部门名称加上唯一约束,来保证不重名,如下:
> ALTER TABLE t_dept ADD CONSTRAINT un_name UNIQUE(name);
2、外键约束:fk_表名,后面紧跟该外键所在的表名和对应的主表名(不含t_)。子表名和父表名用下划线(_)分隔。如下:
>ALTER TABLE t_user ADD CONSTRAINT fk_user_dept FOREIGN KEY(depno) REFERENCES t_dept (id);
3、非空约束:如无特殊需要,建议所有字段默认非空(not null),不同数据类型必须给出默认值(default),如下:
Create table emp(
id int(11) NOT NULL,
name varchar(30) DEFAULT '',
deptId int(11) DEFAULT 0,
salary float DEFAULT NULL,
primary key(id));
4、出于性能考虑,如无特殊需要,建议不使用外键。参照完整性由代码控制。这个也是普遍的做法,从程序角度进行完整性控制,但是如果不注意,也会产生脏数据。
5、命名应使用小写。
12、用户命名规范
1、生产使用的用户命名格式为 code_应用。
2、只读用户命名规则为 read_应用。
13、对象名称使用小写字母、下划线分割
Windows默认情况下无法建立大写库名
Linux大小写敏感,MySQL数据文件(库名、表名、表别名严格区分大小写)
Linux查询大小写敏感
Windows查询大小写不敏感
MySQL 5.6,lower_case_table_names,0:表示区分大小写、1:表示不区分大小写
MySQL 5.7,lower_case_table_names,2:表示区分大小写、1:表示不区分大小写
统一命名使用全小写字母和下划线分割
列名与列表名在所有情况下忽略大小写
四、数据库用户权限规范
1、权限划分一般原则
# 数据库一般划分为生产库,测试库,开发库
1.生产库
DBA:有所有权限,超级管理员权限
应用程序:分配insert、delete、update、select、execute、events、jobs权限。
测试人员:select某些业务表权限
开发人员:select某些业务表权限
原则:所有对线上表的操作,除了应用程序之外,都必须经由DBA来决定是否执行、以及什么时候执行等。
2.测试库
DBA:所有权限。
测试人员:有insert、delete、select、update、execute、jobs权限。
数据分析人员:只有select查询权限
开发人员:有select权限。
原则:DBA有所有权限,而且严格控制表结构的变更,不允许除了dba之外的人对测试环境的库环境进行修改,以免影响测试人员测试。所有对测试库的表结构进行的修改必须由测试人员和DBA一起审核过后才能操作。
3.开发库
DBA:所有权限
测试人员:有库表结构以及数据的所有操作权限。
开发人员:有库表结构以及数据的所有操作权限。
数据分析人员:有库表结构以及数据的所有操作权限。
2、数据库用户划分
# 这里以MySQL为例
1.普通数据管理用户:
-- 赋予对业务表的查询维护权限即可
grant select, insert, update, delete on dbname.* to 'username'@'host' identified by 'pwd';
2.开发人员账户
-- 赋予增删改查的权限
grant select,insert,delete,update on dbname.* to 'kaifa'@'host' identified by 'pwd';
-- 授予创建、修改、删除 MySQL数据表结构权限
grant create,alter,drop on dbname.* to 'kaifa'@'host';
-- 授予操作MySQL外键权限
grant references on dbname.* to 'kaifa'@'host';
-- 授予操作MySQL临时表权限
grant create temporary tables on dbname.* to 'kaifa'@'host';
-- 授予操作MySQL索引权限
grant index on dbname.* to 'kaifa'@'host';
-- 授予操作MySQL视图、查看视图权限
grant create view,show view on dbname.* to 'kaifa'@'host';
-- 授予操作MySQL存储过程、函数权限
grant create routine,alter routine,execute on dbname.* to 'kaifa'@'host';
汇总以上权限
grant select,insert,delete,update,create,alter,drop, references,create temporary tables,index, create view,show view,create routine,alter routine,execute on dbname.* to 'kaifa'@'host' identified by 'pwd';
3.DBA人员账户
-- 授予普通DBA管理某个MySQL数据库的权限
grant all privileges on dbname.* to sysdba@'host' identified by 'pwd';
-- 授予高级DBA管理MySQL中所有数据库的权限
grant all on . to sysdba@'host' identified by 'pwd';
4.数据分析人员只读账号
-- 只需要分配只读的权限
grant select on dbname.* to 'dataquery'@'host' identified by 'pwd';
-- 甚至有些用户,可以只分配读取某些表列的权限
grant select on test.* to 'dataquery'@'host’ identified by 'pwd';
grant select(id,uname) on dbname.tablename to 'dataquery'@’hostname’ identified by 'pwd';
五、数据库维护规范
1、超100万行的批量写(UPDATE、DELETE、INSERT)操作,要分批多次进行操作 ①大批量操作可能会造成严重的主从延迟 主从环境中,大批量操作可能会造成严重的主从延迟,大批量的写操作一般都需要执行一定长的时间,而只有当主库上执行完成后,才会在其他从库上执行,所以会造成主库与从库长时间的延迟情况 ②binlog日志为row格式时会产生大量的日志 大批量写操作会产生大量日志,特别是对于row格式二进制数据而言,由于在row格式中会记录每一行数据的修改,我们一次修改的数据越多,产生的日志量也就会越多,日志的传输和恢复所需要的时间也就越长,这也是造成主从延迟的一个原因。 ③避免产生大事务操作 大批量修改数据,一定是在一个事务中进行的,这就会造成表中大批量数据进行锁定,从而导致大量的阻塞,阻塞会对MySQL的性能产生非常大的影响。 特别是长时间的阻塞会占满所有数据库的可用连接,这会使生产环境中的其他应用无法连接到数据库,因此一定要注意大批量写操作要进行分批。
2、对于大表使用pt-online-schema-change修改表结构 避免大表修改产生的主从延迟,避免在对表字段进行修改时进行锁表。 对大表数据结构的修改一定要谨慎,会造成严重的锁表操作,尤其是生产环境,是不能容忍的。 pt-online-schema-change它会首先建立一个与原表结构相同的新表,并且在新表上进行表结构的修改,然后再把原表中的数据复制到新表中,并在原表中增加一些触发器。把原表中新增的数据也复制到新表中,在行所有数据复制完成之后,把新表命名成原表,并把原来的表删除掉。把原来一个DDL操作,分解成多个小的批次进行。
3、禁止为程序使用的账号赋予super权限 当达到最大连接数限制时,还运行1个有super权限的用户连接super权限只能留给DBA处理问题的账号使用。
4、对于程序连接数据库账号,遵循权限最小原则 程序使用数据库账号只能在一个DB下使用,不准跨库程序使用的账号原则上不准有drop权限。
本文来自博客园,作者:up~up,转载请注明原文链接:https://www.cnblogs.com/soft-engineer/articles/16013897.html