1. 程式人生 > >MySQL 8.0 引數檔案實戰

MySQL 8.0 引數檔案實戰

第一部分 引數檔案概述:
在MySQL啟動過程中會先去讀取引數配置檔案,用於尋找資料庫各種檔案的位置以及指定的初始值。
預設情況下MySQL例項會按照一定的順序在指定的位置進行讀取,使用者可以通過命令檢視:
# mysql --help| grep my.cnf                      
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf 

第二部分 引數檔案:
MySQL的引數檔案和Oracle等資料庫的引數檔案類似,不同的是Oracle例項在啟動時找不到引數檔案是
不能進行mount操作的。MYSQL則稍有不同,沒有引數檔案也可以啟動,此時是啟動的引數是按照MySQL編譯
時指定的預設值和原始碼中設定的值啟動的。但是若在引數檔案配置的引數錯誤,MySQL同樣無法啟動,此時會
啟動失敗,可以在MySQL的錯誤日誌檔案中找到相關資訊。
 
MySQL的引數配置檔案是以文字方式進行儲存,使用者可以通過編輯工具直接進行編輯儲存。

引數檔案的定義:
簡單的說引數檔案應該算是配置檔案,可以看做是KV(Key-Value)對。
示例:
mysql> show variables like 'log_timestamps';
+----------------+--------+
| Variable_name  | Value  |
+----------------+--------+
| log_timestamps | SYSTEM |
+----------------+--------+
1 row in set (0.00 sec)
這裡的log_timestamps 是鍵,value為system.value的可選項有UTC和SYSTEM。

檢視MySQL全部的配置引數可以通過命令:
#show variables;
或者
select * from information_schema.GLOBAL_VARIABLES;
information_schema.GLOBAL_VARIABLES是自MySQL5.1版本開始支援的,而show variables 則各個版本都支援。
第三部分 引數檔案型別:
MySQL的引數根據是否可以在資料庫執行時修改分為2類:
動態引數(dynamic)
靜態引數(static)
動態引數表示可以在MySQL執行時修改引數值,並且立即生效;
靜態引數則表示在MySQL例項執行期間不能修改只能只讀,若要修改生效需要先修改配置檔案再重啟mySQL例項。
若靜態引數修改則會報錯。
set
[GLOBAL | SESSION | PERSIST | PERSIST_ONLY] system_var_name = expr
[@@global. | @@session. | @@persist. | @@persist_only. | @@] system_var_name = expr

通過上面的語句可以看到有關鍵字global和session 這用來標記該引數基於會話還是整個例項的。
有些引數支援會話級動態修改,如autocommit
有些引數支援global動態修改如binlog_cache_size
有些引數既支援session也支援global,如read_buffer_size.
session和global所表示的含義不一樣:
session表示只在當前的會話生效,針對其他的會話不生效;
global表示全域性生效,對所有登入的會話都生效。
在MySQL8.0 之前對全域性的變數值修改了 只能在MYSQL例項的生命週期內生效,並不能對MySQL的引數檔案修改,若MySQL例項重啟則無效,若要生效需要將引數檔案寫到配置檔案等下次重啟之後生效。

相關的許可權:
在MySQL 8.0 若要set global 引數需要許可權 SYSTEM_VARIABLES_ADMIN or SUPER。

第四部分 持久化引數檔案:
在MySQL8.0之前引數檔案的動態修改不能寫到配置檔案,為了改善這一問題MySQL8.0支援了動態修改引數並將其儲存到一個新的引數檔案檔案中mysqld-auto.cnf,預設儲存在$datadir目錄下,在所有的引數之後啟動,需要的許可權為SYSTEM_VARIABLES_ADMIN or SUPER。

從引數持久化的角度來看分為三類:
非持久化引數: 這類引數只能在MYSQL例項啟動前設定好,整個MySQL例項執行期間不能修改不能持久化。
持久化引數:執行時修改生效,並且將修改的引數寫到mysqld-auto.cnf。
只讀持久化引數:修改的引數對執行時不生效,僅寫到mysqld-auto.cnf等待下次啟動生效。
只讀持久化引數需要的許可權為:PERSIST_RO_VARIABLES_ADMIN。
非持久化:Nonpersistent
持久化:PERSIST
只讀持久化:PERSIST_ONLY

下列引數不支援持久化:
auto_generate_certs
basedir
bind_address
character_set_system
character_sets_dir
core_file
datadir
default_authentication_plugin
ft_stopword_file
have_statement_timeout
have_symlink
hostname
init_file
keyring_operations
large_files_support
large_page_size
lc_messages_dir
license
locked_in_memory
log_bin
log_bin_basename
log_bin_index
log_bin_use_v1_row_events
log_error
lower_case_file_system
named_pipe
persisted_globals_load
pid_file
plugin_dir
port
protocol_version
relay_log
relay_log_basename
relay_log_index
relay_log_info_file
secure_file_priv
server_uuid
shared_memory
shared_memory_base_name
skip_external_locking
skip_networking
slave_load_tmpdir
socket
ssl_ca
ssl_capath
ssl_cert
ssl_crl
ssl_crlpath
ssl_key
system_time_zone
tmpdir
version_comment
version_compile_machine
version_compile_os
version_compile_zlib
InnoDB的部分外掛也不支援持久化:
audit_log_current_session
audit_log_file
audit_log_filter_id
audit_log_format
caching_sha2_password_auto_generate_rsa_keys
caching_sha2_password_private_key_path
caching_sha2_password_public_key_path
daemon_memcached_engine_lib_name
daemon_memcached_engine_lib_path
daemon_memcached_option
innodb_buffer_pool_load_at_startup
innodb_data_file_path
innodb_data_home_dir
innodb_dedicated_server
innodb_directories
innodb_force_load_corrupted
innodb_log_group_home_dir
innodb_page_size
innodb_read_only
innodb_temp_data_file_path
innodb_undo_directory
innodb_undo_tablespaces
innodb_version
keyring_encrypted_file_data
keyring_encrypted_file_password
mecab_rc_file
sha256_password_auto_generate_rsa_keys
sha256_password_private_key_path
sha256_password_public_key_path
version_tokens_session
持久化引數的示例:
mysql> show variables like '%general%';
+------------------+-----------------------+
| Variable_name    | Value                 |
+------------------+-----------------------+
| general_log      | OFF                   |
| general_log_file | /data/mysql/node4.log |
+------------------+-----------------------+
2 rows in set (0.00 sec)

mysql> set persist general_log=on;
Query OK, 0 rows affected (0.32 sec)

mysql> show variables like '%general%';
+------------------+-----------------------+
| Variable_name    | Value                 |
+------------------+-----------------------+
| general_log      | ON                    |
| general_log_file | /data/mysql/node4.log |
+------------------+-----------------------+
2 rows in set (0.00 sec)
mysql> system cat /data/mysql/mysqld-auto.cnf
{ "Version" : 1 , "mysql_server" : { "general_log" : { "Value" : "ON" , "Metadata" : { "Timestamp" : 1534276353877164 , "User" : "root" , "Host" : "localhost" } } } }
可以看到 general_log 既生效了由儲存到mysqld-auto.cnf檔案中。

mysql> show variables like 'back_log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| back_log      | 151   |
+---------------+-------+
1 row in set (0.00 sec)

mysql> set persist_only back_log=500;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'back_log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| back_log      | 151   |
+---------------+-------+
1 row in set (0.00 sec)

mysql> system cat /data/mysql/mysqld-auto.cnf
{ "Version" : 1 , "mysql_server" : { "general_log" : { "Value" : "ON" , "Metadata" : { "Timestamp" : 1534276353877164 , "User" : "root" , "Host" : "localhost" } } , "mysql_server_static_options" : { "back_log" : { "Value" : "500" , "Metadata" : { "Timestamp" : 1534276590698267 , "User" : "root" , "Host" : "localhost" } } } } }
back_log引數值預設是151,通過只持久化設定後引數檔案儲存到mysqld-auto.cnf,而執行引數沒有修改。
--重啟MySQL例項:
# /etc/init.d/mysql restart
# mysql -poracle -S /tmp/mysql.sock
mysql> show variables like 'back_log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| back_log      | 500   |
+---------------+-------+
1 row in set (0.00 sec)

mysql> show variables like 'general%';
+------------------+-----------------------+
| Variable_name    | Value                 |
+------------------+-----------------------+
| general_log      | ON                    |
| general_log_file | /data/mysql/node4.log |
+------------------+-----------------------+
2 rows in set (0.00 sec)
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.12    |
+-----------+
可以看到重啟時候後這些之前持久化的引數值依然是我們修改的值,而不需要手動寫到my.cnf檔案中。


第五部分  引數的檔案的配置:
在配置檔案中有很多開關,此時設定為數字1和true和on的效果一樣表示開啟,相反的1、false、off表示關閉。
還要一種情況只寫引數則表示開啟改引數。
示例:
[mysqld]
skip-name-resolve
登入檢視:
mysql> show variables like 'skip%name%resolve';     
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| skip_name_resolve | ON    |
+-------------------+-------+
1 row in set (0.01 sec)
因為寫作0或者1對真正要表示數值的引數,只看引數值的話可能有誤解,建議將開啟和關閉使用on和off來代替數字,讓數字真正表達需要數字的引數上。

第六部分 推薦的配置的引數檔案:
server-id                      = 1
port                           = 3306
mysqlx_port                    = 33060
mysqlx_socket                  = /tmp/mysqlx.sock
datadir                        = /data/mysql
socket                         = /tmp/mysql.sock
pid-file                       = /tmp/mysqld.pid
log-error                      = error.log
slow-query-log                 = 1
slow-query-log-file            = slow.log
long_query_time                = 0.2
#log-bin                        = bin.log
relay-log                      = relay.log
binlog_format                 =ROW
relay_log_recovery            = 1
character-set-client-handshake = FALSE
character-set-server           = utf8mb4
collation-server               = utf8mb4_unicode_ci
init_connect                   ='SET NAMES utf8mb4'
innodb_buffer_pool_size        = 1G
join_buffer_size               = 128M
sort_buffer_size               = 2M
read_rnd_buffer_size           = 2M
log_timestamps                 = SYSTEM
lower_case_table_names         = 1
default-authentication-plugin  =mysql_native_password
skip-name-resolve
slave_skip_errors              = ddl_exist_errors
#skip-grant-tables 
max_heap_table_size           =32M
tmp_table_size                =64M