从零开始学 mysql – 零碎参数和配置
前言
本节咱们来讲述对于 MYSQL 的系统启动命令相干内容,也是比拟根底然而可能有些人会很含糊的内容,本节的外围也是讲述配置无关的内容
思维导图
导图地址:https://www.mubucm.com/doc/7D…
概述
上面是对于本文的简略提要:
-
,命令行的命令格局
- 单划线和双划线
-
配置文件
-
配置文件读取程序
- window,mac,Linux 的配置读取程序比照
- 配置文件的内容
- 特定版本配置
-
配置文件优先级
- 多配置文件和单文件配置的读书个性:总是以最初为准
- 自定义配置读取:通常为命令行指定读取
-
-
零碎变量的配置
- 查看零碎变量
- 设置零碎变量
-
运行时的零碎变量
- 作用范畴:全局变量和会话变量
- 全局变量和会话变量设置
- 查看零碎变量的范畴
- 零碎变量的注意事项
- 启动选项和零碎变量的区别
-
状态变量的补充
- 如何查看状态变量
命令行命格局
单划线和双划线命令格局
命令行命令就是咱们通常连贯 mysql 应用的命令,命令行的命令个别分为两种,首先是双划线的命令,比方应用 mysqld --skip-networing
就能够禁止客户端连贯,这种命令也被称之为长命令,应用命令的时候须要应用--
两个短划线进行拼接,另一种是更为罕用的命令 -h
,-p
等命令,这样的命令只须要一个短划线即可(为 –host,–port 的命令简称)。
命令的另一种写法是应用 下划线 进行代替,–skip_networing。
单划线命令成果如下,服务端开启禁止客户端登陆之后应用客户端连贯就不容许了:
mysql -h127.0.0.1 -uroot -p
Enter password:
ERROR 2003 (HY000): Can't connect to MySQL server on'127.0.0.1' (61)
另外一个案例是服务端启动的默认创立表引擎,比方咱们须要改为 InnoDB 引擎在应用命令的时候加上 --default-storage-engine=InnoDB
选项,最初只有在任意的数据库下创立一张表,在开端能够发现表的的存储引擎变了,当然默认的存储引擎看不到成果,能够应用 MyISAM
进行验证:
ENGINE=MyISAM DEFAULT CHARSET=utf8
mysql 的默认装置之后启动会主动附加一些参数,比方上面的命令,这里有个命令的重要应用规定是不要把变量申明的习惯带进来,在命令的 =(等号)两边减少空格是不被容许的:
/usr/local/mysql/bin/mysqld --user=_mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --log-error=/usr/local/mysql/data/mysqld.local.err --pid-file=/usr/local/mysql/data/mysqld.local.pid --keyring-file-data=/usr/local/mysql/keyring/keyring --early-plugin-load=keyring_file=keyring_file.so
最初如果不分明如何应用命令,间接应用 --help
,不过只有一个mysqld
的比拟非凡,他须要应用 --verbose --help
才行,记不住也没关系,在 --help
的命令最初 mysql 会给咱们进行提醒,还是比拟贴心的(不过我感觉大多数人还是会应用度娘查命令,哈哈。)
For more help options (several pages), use mysqld --verbose --help.
配置文件
尽管命令的形式非常的不便,在启动的时候也有较高的自由度,然而这种形式用的其实并不是很多,理论工作应用配置文件的模式会更多,配件文件的模式是更为罕用的也是更容易记忆的形式,然而在理解配置文件之前,咱们须要大抵理解配置文件的 读取程序。当然不须要牢固的记忆,只有作为理解即可。
配置文件的读取程序
Window 的配置文件读取程序
Windows 不是应用 MySQL 的重点,然而作为自我练习的时候还是须要理解的,他的配置读取程序如下。
- %WINDIR%\my.ini %windir\my.cnf%(echo %WINDIR% 获取)
- C:\my.ini C:\my.cnf
- Basdir\my.ini basdir\my.cnf(based it 指的是默认的装置门路)
- Defaults-extra-file 命令行制订的额定配置文件门路
- %appdata%\MySQL\ .mylogin.cnf 登陆门路选项(客户端指定,通过 echo %APPDATA% 能够获取)
下面第一条呈现 .ini
和.cnf
意味着反对多种后缀文件格式,%windir%
示意为 windows 的目录地位,通常是 C:\windows
。另外最初两个配置有点特地,第四个指的是能够利用命令参数:—defaults-extra-file=C:\xxxx\xxx\xxx.txt
这样的形式指定要读取的配置文件,而最初一个 %appdata%
指的是 windows 对应应用程序目录值,另外这个.mylogin.cnf(留神后面的小数点)这个文件不是和后面一样相似的纯文本,而是应用mysql_config_editor 应用程序的加密文件,文件也只能固定为 mysql 规定的一些配置信息。(这些配置这里借用官网查看一下)
Mysql_config_editor 这个编辑器是 mysql 官网开发的一个可执行的文件。具体的参数配置能够参考官网的配置进行解决。
类 Unix 的配置读取
废话不多说,咱们来看下类 Unix 的零碎读取配置,这个配置不同于 window 须要认真看待,当然最好能时常回顾,因为 Linux 上应用 mysql 的场景会比拟多。
- /etc/MySQL/my.inf
- SYSCONFIGDIR/my.cnf(MySQL 的零碎装置目录)
- %MYSQL_HOME%/my.cnf 仅限服务器的选项
- Defaults_extra-file 同样为命令行指定读取
- ~/.my.cnf(留神后面的逗号)
- ~/.mylogin.cnf 须要mysql_config_editor 的反对并不是纯文本文件
SYSCONFDIR 示意在应用 CMake 构建 MySQL 时应用 SYSCONFDIR 选项指定的目录,默认的状况下为 /etc
的上面。
mysql_home 置信理解环境变量这个概念的都比拟相熟,能够自由选择设置还是不设置,咱们能够在配置的环境变量下搁置一个 my.cnf,然而如果搁置之后,内容就不能乱写了,只能搁置 对于启动服务器程序的相干选项(意味着客户端和服务端端配置能够共存),这里再次强调和 .mylogin.cnf
文件还是有差异,他的限度更加严格(再次啰嗦留神后面的小数点)。
补充:Mysql.server 会间接调用 mysqld_safe 这个命令,而 mysqld_safe 的命令会应用 mysqld 命令,最初 mysqld 装置规定当然也会依照规定配置文件,说了这么多后果就是:mysql.server 如果发现环境变量配置了 my.cnf 文件也会进行配置文件的利用。
~是属于类 unix 零碎的特殊符号,代表 以后用户登陆的根门路,比方 mac 上面通常为/User/ 用户名
,通常能够应用 home 的环境变量查看,因为是每一个用户都存在一个目录,所以最初两个配置的读取程序其实都是依据不同登陆用户判断的,所以能够在这个目录上面构建这两个“专属”文件。
Defaults-extra-file 指定为:—defaults-extra-file=C:\xxxx\xxx\xxx.txt
这样的形式指定要读取的配置文件,和 windows 的形式统一,因为
.mylogin.cnf
含意和 window 中也是一样的,须要mysql_config_editor 的反对并不是纯文本文件,也不能随便的更改。
mac 系统配置读取
mac 零碎的配置读取须要肯定的获取技巧,能够应用mysql -verbose –help | grep my.cnf 这个命令来获取,能够看到上面的门路和下面讲述的门路大抵逻辑是统一的。
./mysql --verbose --help | grep my.cnf
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
然而集体理论寻找的时候发现 没有任何 的配置文件,依据网上的材料发现须要去 /usr/local/supporting-file
上面有一个配置文件的模版,然而集体实际操作之后发现这个文件还是不存在的,最初不得已只能去官网拷贝一份配置文件而后依照下面的打印的规定放到指定的目录去了 …..
配置文件内容
理解完配置文件的根本读取程序之后,上面咱们来理解配置文件的内容,这里说一下小插曲,mac 的配置文件在 /usr/local/mysql
中无奈发现配置文件,所以这里只好拿官网的样例文件进行解释,为了避免篇幅过长,这里放到了文章的最初局部,从配置文件中首先咱们能够看到很多的配置分组,比方如下的模式:
[server] (具体的启动选项...)
[mysqld] (具体的启动选项...)
[mysqld_safe] (具体的启动选项...)
[client] (具体的启动选项...)
[mysql] (具体的启动选项...)
[mysqladmin] (具体的启动选项...)
通过这样的分组之后,能够在不同的分组下能够配置,依据分组的配置项咱们又能够分为两种,一种是:选项
另一种是 选项 = 选项值
,须要留神的是在配置文件中不能编写h=127.0.0.1
短链接模式而是全副只能应用 长模式 的配置形式,同时配置文件和命令行不同的是容许两头退出空格的,比方 slow_query_log = 0
,另外咱们能够应用#
符号进行正文,比方 #xxxx
,最初咱们再来看下一下命令行的模式:--option
和--option=optionvalue
。
分组的意义在于能够将客户端的命令和服务端的命令进行辨别,比方上面的不同分组咱们能够清晰配置变量的作用范畴,也可能更好的布局咱们的服务器启动参数或者客户端的连贯参数。
[server] 组下边的启动选项将作用于所有的服务器程序。[client] 组下边的启动选项将作用于所有的客户端程序
须要留神的是 mysql_safe
和mysql.server
根本都会间接调用 mysqld
命令,从命令的读取范畴咱们也能够理解到为什么倡议应用 mysql.server 或者 mysql.safe 这两个命令,同时也能够发现 mysql 的客户端命令只能读取 mysql 上面的命令以及 client 上面的命令,通过上面的图表能够发现咱们基本上只须要学习两个比拟罕用的命令 mysqld_safe
和mysql.server
的读取范畴即可。
Mysql.server 命令自身就是设计为针对配置文件应用,所以他最终反对的命令行的命令仅仅为
start
和stop
特定版本的配置
mysql 的配置文件反对依据版本号的形式读取配置,比方 8.0 咱们能够配置[mysqld-8.0],而 5.7 咱们就能够应用[mysqld-5.7],他们自身的作用是统一的,然而会依据以后的 mysql 版本匹配进行失效。
配置文件的优先级
总结起来就是两句话,如下记忆即可:
- 多个文件 s 以文件的读取程序中最初的读取的为最终后果
- 单文件反复分组依照最初一个组中呈现的配置为主
多配置文件的读取
通常状况下除非咱们在 mysql 连贯的时候应用指定的配置文件读取门路,否则咱们通常应用下面介绍过的配置文件的读取程序进行读取,这时候有可能呈现一种状况就是多个配置文件下呈现雷同的配置到底应该利用哪一个配置?这里只有记住一条铁律就是 最初的读取的为最终后果。
单文件反复配置读取
单文件读取的优先级应用的是,依照 最初一个组中呈现的配置为主,比如说呈现过上面的参数配置,会依照 MyISAM 的配置进行读取。
[server]
default-storage-engine=InnoDB
[mysqld]
default-storage-engine=MyISAM
自定义指定配置读取
如果你不想记忆那些默认的搜寻规定,或者为了保障配置依照本人的想法进行读取,能够应用 mysqld --defaults-file=/tmp/myconfig.txt
的命令形式指定你须要读取的配置文件门路,然而须要留神 --defaults-file
和defaults-extra-file
这两个命令是有区别的,defaults-extra-file
能够指定额定的门路而--defaults-file
只能指定一个配置门路。
补充:如果遇到配置文件和命令行呈现雷同的配置,最初无论配置文件如何进行配置,所有依照命令行的配置为主。
零碎变量配置
默认状况下如果咱们没有进行任何配置,mysql 会默认给咱们调配一个配置,比方最大连接数,谬误连贯次数,或者查问的缓存大小等等变量的配置等,如果咱们想要理解以后的配置变量,咱们能够应用如下的命令进行查看。
查看零碎变量
SHOW VARIABLES [LIKE 匹配的模式];
比方咱们依照上面的命令进行运行查看,能够看到数量有几百条,一个个看是看不过去的,所以咱们进行零碎变量配置的时候会应用某一个大分类下的具体配置进行查看(上面应用了通配符的写法):
mysql> show variables like '%%';
+----------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value |
+----------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| activate_all_roles_on_login | OFF |
| admin_address | |
| admin_port | 33062 |
| admin_ssl_ca | |
| admin_ssl_capath | |
| admin_ssl_cert | |
| admin_ssl_cipher |
....
| windowing_use_high_precision | ON |
+----------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
638 rows in set (0.01 sec)
比方咱们想查看以后 mysqld 服务的默认存储引擎能够应用如下的命令,这时候就会只显示一条数据,感兴趣的读者也能够试一试在连贯 mysql 服务之后执行 SHOW VARIABLES like 'max_connections';
命令查看成果:
mysql> SHOW VARIABLES LIKE 'default_storage_engine';
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| default_storage_engine | InnoDB |
+------------------------+--------+
1 row in set (0.00 sec)
另外在 mysql 中想要含糊的查看某一个我的项目的配置,能够应用百分号 % 进行通配符搜寻,比方上面这样:
mysql> show variables like 'mysql%';
+---------------------------------------------+----------------------------------------+
| Variable_name | Value |
+---------------------------------------------+----------------------------------------+
| mysql_native_password_proxy_users | OFF |
| mysqlx_bind_address | * |
| mysqlx_compression_algorithms | DEFLATE_STREAM,LZ4_MESSAGE,ZSTD_STREAM |
| mysqlx_connect_timeout | 30 |
| mysqlx_deflate_default_compression_level | 3 |
| mysqlx_deflate_max_client_compression_level | 5 |
| mysqlx_document_id_unique_prefix | 0 |
| mysqlx_enable_hello_notice | ON |
| mysqlx_idle_worker_thread_timeout | 60 |
| mysqlx_interactive_timeout | 28800 |
| mysqlx_lz4_default_compression_level | 2 |
| mysqlx_lz4_max_client_compression_level | 8 |
| mysqlx_max_allowed_packet | 67108864 |
| mysqlx_max_connections | 100 |
| mysqlx_min_worker_threads | 2 |
| mysqlx_port | 33060 |
| mysqlx_port_open_timeout | 0 |
| mysqlx_read_timeout | 30 |
| mysqlx_socket | /tmp/mysqlx.sock |
| mysqlx_ssl_ca | |
| mysqlx_ssl_capath | |
| mysqlx_ssl_cert | |
| mysqlx_ssl_cipher | |
| mysqlx_ssl_crl | |
| mysqlx_ssl_crlpath | |
| mysqlx_ssl_key | |
| mysqlx_wait_timeout | 28800 |
| mysqlx_write_timeout | 60 |
| mysqlx_zstd_default_compression_level | 3 |
| mysqlx_zstd_max_client_compression_level | 11 |
+---------------------------------------------+----------------------------------------+
30 rows in set (0.00 sec)
设置零碎变量
咱们理解了如何查看零碎变量之后,上面咱们来学习如何进行零碎变量的设置,其实咱们在之前曾经讲述过如何设置零碎变量,比方咱们在读取配置文件的时候应用 --default-file=xxx
的形式自定义读取配置文件的地位,又或者在配置文件外面制订配置而后在启动 mysqld 服务器进行读取相干的配置,比方下面提到的default-storage-engine=MyISAM
,所以配置选项有上面的两种:
- 通过命令行启动选项
- 通过配置文件启动选项
所以设置零碎变量也没有什么特地的,无非就是这两种形式罢了。
补充:对于启动选项来说,如果启动选项名由多个单词组成,各个单词之间用短划线 – 或者下划线 连接起来都可 以,然而对应的零碎变量之间必须应用下划线 连接起来
运行时的零碎变量
mysql 的零碎变量的个性是:对于少数的零碎变量都是能够在服务器程序运行的时候动静批改,然而很多时候咱们对于运行时的变量批改这个概念非常含糊,到底什么时候批改变量时长期的,什么时候又是全局失效的,这里须要好好来唠叨一下。针对一次客户端端连贯咱们会有上面的状况:客户端 A 应用配置 1,而客户端 B 应用配置 2 然而咱们并不想他们公有更改零碎的固定配置,这样必定是不行的,另一种状况是咱们想要每一个客户端连贯的时候想要能够应用一一些自定义的配置要如何解决?依据下面的形容,咱们能够看到零碎变量运行时候的配置呈现的上面两个问题:
- 连贯时的零碎变量配置
- 私有参数的私有化问题
为了解决这两个问题,mysql 设计了“作用范畴”的形式来辨别运行时的零碎变量和全局的零碎变量。
作用范畴
依据 mysql 的规定定义,他将变量分为上面两种:
- GLOBAL : 全局变量,影响服务器的整体操作。
- SESSION : 会话变量,影响 某个客户端连贯 的操作。(注: SESSION 有个别名叫 LOCAL(本次连贯变量或者以后变量,不是本地变量哦))
服务器启动的时候,他会将所有连贯以后服务端程序的客户端默认的变量配置为 GLOBAL 的全局变量的配置,也就是说每一个客户端连贯的时候都会 继承 一份 GLOBAL 全局变量为 SESSION的会话变量进行应用,比方咱们通过 mysqld
命令进行设置的变量都是 GLOABL
全局变量,因为这时候服务器还在启动不可能会有会话变量的存在,而应用 mysql
命令进行连贯才有可能会呈现会话变量的调整。
补充:特别强调会话变量的作用范畴仅仅限度于一次客户端的连贯,当建设一次新的客户端连贯的时候又会接着依照继承全局变量的形式从新读取(前提是你的新客户端没有对与配置进行批改),所以须要非常小心以后变量的作用范畴
最初,为了避免你头晕,这里咱们只须要进行如下的记忆:
Mysqld:服务端启动的相干配置都是全局的变量
Mysql:客户端连贯的命令产生的配置,连贯前的命令行应用会话变量,在连贯时能够进行相干命令操作把全局变量变为长期变量。
全局变量和会话变量的设置
设置零碎变量个别有上面两种办法,
SET [GLOBAL|SESSION] 零碎变量名 = 值;
SET [@@(GLOBAL|SESSION).]var_name = XXX;
比方如果咱们想要设置服务端端全局变量的参数:
SET GLOBAL default_storage_engine = MyISAM;
SET @@GLOBAL.default_storage_engine = MyISAM;
上面是客户端进行连贯的时候,咱们能够应用 SESSION 的变量设置办法设置以后的参数和变量参数。
SET SESSION default_storage_engine = MyISAM;
SET @@SESSION.default_storage_engine = MyISAM;
SET default_storage_engine = MyISAM;
查看零碎变量的作用范畴
既然引入了变量的作用范畴,那么咱们最开始提到的对于零碎变量的作用范畴,查看的是全局变量还是以后变量?认真思考其实不难理解,答案是:默认查看的是 SESSION 作用范畴的零碎变量,既然默认看以后的变量值,当然咱们也能够在查看零碎变量的语句上加上要查看哪个 作用范畴 的零碎变量,就像这样:
SHOW [GLOBAL|SESSION] VARIABLES [LIKE 匹配的模式];
上面是对于局部操作的演示,当然也能够进个集体的试验:
SHOW SESSION VARIABLES LIKE 'default_storage_engine';
SHOW GLOBAL VARIABLES LIKE 'default_storage_engine';
SET SESSION default_storage_engine = MyISAM;
SHOW SESSION VARIABLES LIKE 'default_storage_engine';
因为篇幅无限这里就不展现运行后果了,置信看到语法之后也能够很快的了解含意。
补充:值得注意的是 SESSION 的变量只会针对设置了变量之后的后续的客户端连贯的值,而不会批改之前曾经进行连贯的客户端的参数,并且咱们能够发现批改某个客户端的连贯以后配置,并不会影响 GLOBAL 全局变量的设置。
零碎变量注意事项
-
并不是所有零碎变量都具备 GLOBAL 和 SESSION 的作用范畴。
- 有一些零碎变量只具备 GLOBAL 作用范畴,比方说 max_connections。
- 有一些零碎变量只具备 SESSION 作用范畴,比方 insert_id。
- 有一些零碎变量的值既具备 GLOBAL 作用范畴,也具备 SESSION 作用范畴,比方咱们前边用到的 default_storage_engine。
-
有些零碎变量是只读的,并不能设置值。
- 比方说 version,示意以后 MySQL 的版本。批改即没有意义,也不能批改。
启动选项和零碎变量的区别
启动选项能够看作是咱们启动变量的时候应用 --
(双划线) 或者 -
(单划线) 进行设置的零碎变量启动参数,并且大部分的零碎变量都是能够应用零碎变量参数进行设置的,所以对于零碎变量和启动选项有如下的区别:
- 大部分零碎变量能够应用启动选项的形式设置
- 局部零碎变量是启动启动的时候生成,无奈作为启动选项(比方:
character_set_client
) - 有些启动选项也不是零碎变量,比方
defaults-file
状态变量
服务器也不全是零碎变量,为了反馈零碎的性能,会存在诸如状态变量的参数,比方手以后连贯的线程数量,以及连贯的谬误次数等等,因为这些参数反馈的是服务器本身的运行状况,所以不能由程序员设置,而是须要依附应用程序设置。
查看状态变量
这里可能会好奇为什么状态变量也存在全局和以后变量的参数区别?这里不要被误导了,下面阐明的是能够由应用程序设置,也就意味着会存在多个客户端拜访的状况,所以也须要思考区别全局和以后的状况,最初查看状态变量的命令如下:
SHOW [GLOBAL|SESSION] STATUS [LIKE 匹配的模式];
上面是一个理论的操作案例:
mysql> SHOW STATUS LIKE 'thread%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_cached | 0 |
| Threads_connected | 1 |
| Threads_created | 1 |
| Threads_running | 2 |
+-------------------+-------+
4 rows in set (0.01 sec)
能够看到所有和 thread 相干的变量都进行了展现。
总结
本节咱们从命令行的格局根底开始,介绍了 mysql 如何进行配置的读取的,以及在读取配置的时候须要留神哪下状况,这外面的细节还是比拟多的,并且操作系统的不同会存在读取程序的不同,然而根本只须要重点记忆和 Linux 无关的参数即可。
写在最初
写下来发现写的内容挺多的,须要多回顾和总结能力缓缓消化。
补充材料
My.ini 配置文件模板(5.7)
My.ini 配置模板获取网站配置文件
如果感觉内容不明不白的,能够去官网的介绍页面进行理解,地址如下:
https://www.fromdual.com/mysq…
当然最初如果懒得拜访网页的,这里也间接从网页吧模板拷贝过去了。
#
# FromDual configuration file template for MySQL, Galera Cluster, MariaDB and Percona Server
# Location: %MYCNF%
# This template is intended to work with MySQL 5.7 and newer and MariaDB 10.3 and newer
# Get most recent updated from here:
# https://www.fromdual.com/mysql-configuration-file-sample
#
[client]
port = %PORT% # default 3306
socket = %SOCKET% # Use mysqld.sock on Ubuntu, conflicts with AppArmor otherwise
[mysql]
no_auto_rehash
max_allowed_packet = 16M
prompt = '\u@\h [\d]>' # 'user@host [schema]>'
default_character_set = utf8 # Possibly this setting is correct for most recent Linux systems
[mysqldump]
max_allowed_packet = 16M
[mysqld]
# Connection and Thread variables
port = %PORT% # default 3306
socket = %SOCKET% # Use mysqld.sock on Ubuntu, conflicts with AppArmor otherwise
basedir = %BASEDIR%
datadir = %DATADIR%
# tmpdir = '%INSTANCEDIR%/tmp'
max_allowed_packet = 16M
default_storage_engine = InnoDB
# explicit_defaults_for_timestamp = 1 # MySQL 5.6 ff. default in MySQL 8.0, test carefully! This can have an impact on application.
# disable_partition_engine_check = true # Since MySQL 5.7.17 to 5.7.20. To get rid of nasty message in error log
# character_set_server = utf8mb4 # For modern applications, default in MySQL 8.0
# collation_server = utf8mb4_general_ci
max_connections = 151 # Values < 1000 are typically good
max_user_connections = 145 # Limit one specific user/application
thread_cache_size = 151 # Up to max_connections makes sense
# Query Cache (does not exist in MySQL 8.0 any more!)
# query_cache_type = 1 # Set to 0 to avoid global QC Mutex, removed in MySQL 8.0
# query_cache_size = 32M # Avoid too big (> 128M) QC because of QC clean-up lock!, removed in MySQL 8.0
# Session variables
sort_buffer_size = 2M # Could be too big for many small sorts
tmp_table_size = 32M # Make sure your temporary results do NOT contain BLOB/TEXT attributes
read_buffer_size = 128k # Resist to change this parameter if you do not know what you are doing
read_rnd_buffer_size = 256k # Resist to change this parameter if you do not know what you are doing
join_buffer_size = 128k # Resist to change this parameter if you do not know what you are doing
# Other buffers and caches
table_definition_cache = 1400 # As big as many tables you have
table_open_cache = 2000 # connections x tables/connection (~2)
table_open_cache_instances = 16 # New default in 5.7
# MySQL error log
log_error = %INSTANCEDIR%/log/%UNAME%_%INSTANCE%_error.log # Adjust AppArmor configuration: /etc/apparmor.d/local/usr.sbin.mysqld
# log_timestamps = SYSTEM # MySQL 5.7, equivalent to old behaviour
# log_warnings = 2 # MariaDB equivalent to log_error_verbosity = 3, MySQL does NOT support this any more!
# log_error_verbosity = 3 # MySQL 5.7 ff., equivalent to log_warnings = 2, MariaDB does NOT support this!
innodb_print_all_deadlocks = 1
# wsrep_log_conflicts = 1 # for Galera only!
# Slow Query Log
slow_query_log_file = %INSTANCEDIR%/log/%UNAME%_%INSTANCE%_slow.log # Adjust AppArmor configuration: /etc/apparmor.d/local/usr.sbin.mysqld
slow_query_log = 0
log_queries_not_using_indexes = 0 # Interesting on developer systems!
long_query_time = 0.5
min_examined_row_limit = 100
# General Query Log
general_log_file = %INSTANCEDIR%/log/%UNAME%_%INSTANCE%_general.log # Adjust AppArmor configuration: /etc/apparmor.d/local/usr.sbin.mysqld
general_log = 0
# Performance Schema
# performance_schema = ON # for MariaDB 10 releases
performance_schema_consumer_events_statements_history_long = ON # MySQL 5.6/MariaDB 10 and newer
# Binary logging and Replication
server_id = %SERVERID% # Must be set on MySQL 5.7 and newer if binary log is enabled!
log_bin = %INSTANCEDIR%/binlog/%UNAME%_%INSTANCE%_binlog # Locate outside of datadir, adjust AppArmor configuration: /etc/apparmor.d/local/usr.sbin.mysqld
# master_verify_checksum = ON # MySQL 5.6 / MariaDB 10.2
# binlog_cache_size = 1M # For each connection!
# binlog_stmt_cache_size = 1M # For each connection!
max_binlog_size = 128M # Make bigger for high traffic to reduce number of files
sync_binlog = 1 # Set to 0 or higher to get better write performance, default since MySQL 5.7
expire_logs_days = 5 # We will survive Easter holidays
# binlog_expire_logs_seconds = 432000 # MySQL 8.0, 5 days * 86400 seconds
binlog_format = ROW # Use MIXED if you want to experience some troubles, default since MySQL 5.7, MariaDB default is MIXED
# binlog_row_image = MINIMAL # Since 5.6, MariaDB 10.1
# auto_increment_increment = 2 # For Master/Master set-ups use 2 for both nodes
# auto_increment_offset = 1 # For Master/Master set-ups use 1 and 2
# Slave variables
log_slave_updates = 1 # Use if Slave is used for Backup and PiTR, default since MySQL 8.0
read_only = 0 # Set to 1 to prevent writes on Slave
# super_read_only = 0 # Set to 1 to prevent writes on Slave for users with SUPER privilege. Since 5.7, not in MariaDB
# skip_slave_start = 1 # To avoid start of Slave thread
# relay_log = %UNAME%_%INSTANCE%_relay-bin
# relay_log_info_repository = TABLE # MySQL 5.6, default since MySQL 8.0, MySQL only
# master_info_repository = TABLE # MySQL 5.6, default since MySQL 8.0, MySQL only
# slave_load_tmpdir = '%INSTANCEDIR%/tmp' # defaults to tmpdir
# Crash-safe replication Master
# binlog_checksum = CRC32 # default
# sync_binlog = 1 # default since 5.7.6, but slow!
# innodb_support_xa = 1 # default, depracted since 5.7.10
# Crash-safe replication Slave
# relay_log_info_repository = TABLE # MySQL 5.6, default since MySQL 8.0, MySQL only
# master_info_repository = TABLE # MySQL 5.6, default since MySQL 8.0, MySQL only
# relay_log_recovery = 1
# sync_relay_log_info = 1 # default 10000
# relay_log_purge = 1 # default
# slave_sql_verify_checksum = 1 # default
# GTID replication
# gtid_mode = ON # MySQL only, Master and Slave
# enforce_gtid_consistency = 1 # MySQL only, Master and Slave
# log_bin = %INSTANCEDIR%/binlog/%UNAME%_%INSTANCE%_binlog # In 5.6 also on Slave
# log_slave_updates = 1 # In 5.6 also on Slave
# Security variables
# local_infile = 0 # If you are security aware
# secure_auth = 1 # If you are security aware
# sql_mode = TRADITIONAL,ONLY_FULL_GROUP_BY,NO_ENGINE_SUBSTITUTION,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO # Be careful changing this afterwards, NO_AUTO_CREATE_USER does NOT exist any more in MySQL 8.0
# skip_name_resolve = 0 # Set to 1 if you do not trust your DNS or experience problems
# secure_file_priv = '%INSTANCEDIR%/tmp' # chmod 750, adjust AppArmor configuration: /etc/apparmor.d/local/usr.sbin.mysqld
# MyISAM variables
key_buffer_size = 8M # Set to 25 - 33 % of RAM if you still use MyISAM
myisam_recover_options = 'BACKUP,FORCE'
# disabled_storage_engines = 'MyISAM,MEMORY' # MySQL 5.7, do NOT during/before mysql_upgrade, good for Galera!
# MEMORY variables
max_heap_table_size = 64M # Should be greater or equal to tmp_table_size
# InnoDB variables
innodb_strict_mode = ON # Default since MySQL 5.7, and MariaDB 10.4
innodb_buffer_pool_size = 128M # Go up to 75% of your available RAM
innodb_buffer_pool_instances = 8 # Bigger if huge InnoDB Buffer Pool or high concurrency
innodb_file_per_table = 1 # Is the recommended way nowadays
# innodb_flush_method = O_DIRECT # O_DIRECT is sometimes better for direct attached storage
# innodb_write_io_threads = 8 # If you have a strong I/O system or SSD
# innodb_read_io_threads = 8 # If you have a strong I/O system or SSD
# innodb_io_capacity = 1000 # If you have a strong I/O system or SSD
innodb_flush_log_at_trx_commit = 2 # 1 for durability, 0 or 2 for performance
innodb_log_buffer_size = 16M # Bigger if innodb_flush_log_at_trx_commit = 0
innodb_log_file_size = 256M # Bigger means more write throughput but longer recovery time
# Since MariaDB 10.0 and MySQL 5.6
innodb_monitor_enable = all # Overhead < 1% according to PeterZ/Percona
# Galera specific MySQL parameter
# default_storage_engine = InnoDB # Galera only works with InnoDB
# innodb_flush_log_at_trx_commit = 2 # Durability is achieved by committing to the Group
# innodb_autoinc_lock_mode = 2 # For parallel applying
# binlog_format = row # Galera only works with RBR
# query_cache_type = 0 # Use QC with Galera only in a Master/Slave set-up, removed in MySQL 8.0
# query_cache_size = 0 # removed in MySQL 8.0
# log_slave_updates = ON # Must be enabled on ALL Galera nodes if binary log is enabled!
# server_id = ... # Should be equal on all Galera nodes according to Codership CTO if binary log is enabled.
# WSREP parameter
# wsrep_on = on # Only MariaDB >= 10.1
# wsrep_provider = /usr/lib/galera/libgalera_smm.so # Location of Galera Plugin on Ubuntu ?
# wsrep_provider = /usr/lib64/galera-3/libgalera_smm.so # Location of Galera v3 Plugin on CentOS 7
# wsrep_provider = /usr/lib64/galera-4/libgalera_smm.so # Location of Galera v4 Plugin on CentOS 7
# wsrep_provider_options = 'gcache.size = 1G' # Depends on you workload, WS kept for IST
# wsrep_provider_options = 'gcache.recover = on' # Since 3.19, tries to avoid SST after crash
# wsrep_cluster_name = "My cool Galera Cluster" # Same Cluster name for all nodes
# wsrep_cluster_address = "gcomm://192.168.0.1,192.168.0.2,192.168.0.3" # Start other nodes like this
# wsrep_node_name = "Node A" # Unique node name
# wsrep_node_address = 192.168.0.1 # Our address where replication is done
# wsrep_node_incoming_address = 10.0.0.1 # Our external interface where application comes from
# wsrep_sync_wait = 1 # If you need realy full-synchronous replication (Galera 3.6 and newer)
# wsrep_slave_threads = 16 # 4 - 8 per core, not more than wsrep_cert_deps_distance
# wsrep_sst_method = rsync # SST method (initial full sync): mysqldump, rsync, rsync_wan, xtrabackup-v2
# wsrep_sst_auth = sst:secret # Username/password for sst user
# wsrep_sst_receive_address = 192.168.2.1 # Our address where to receive SST
# Group Replication parameter
# default_storage_engine = InnoDB # Group Replication only works with InnoDB
# server_id = %SERVERID% # Should be different on all 3 nodes
# log_bin = %INSTANCEDIR%/binlog/%UNAME%_%INSTANCE%_binlog # Locate outside of datadir, adjust AppArmor configuration: /etc/apparmor.d/local/usr.sbin.mysqld
# binlog_format = ROW
# binlog_checksum = NONE # not default!
# gtid_mode = ON
# enforce_gtid_consistency = ON
# master_info_repository = TABLE
# relay_log_info_repository = TABLE
# log_slave_updates = ON
# slave_parallel_workers = <n> # 1-2/core, max. 10
# slave_preserve_commit_order = ON
# slave_parallel_type = LOGICAL_CLOCK
# transaction_write_set_extraction = XXHASH64
# loose-group_replication_group_name = "$(uuidgen)" # Must be the same on all nodes
# loose-group_replication_start_on_boot = OFF
# loose-group_replication_local_address = "192.168.0.1"
# loose-group_replication_group_seeds = "192.168.0.1,192.168.0.2,192.168.0.3" # All nodes of Cluster
# loose-group_replication_bootstrap_group = OFF
# loose-group_replication_single_primary_mode = FALSE # = multi-primary