MySQL 8.0 引數檔案實戰
阿新 • • 發佈:2019-02-17
第一部分 引數檔案概述: 在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