备份还原
备份配置的一种简单方法是将 mysqld-auto.cnf 文件复制到安全位置。
同样,我们可以通过复制回来来恢复配置。
但是,如果我们想要大部分配置而不是所有配置,或者我们想要编辑某些值,该怎么办?
在这种情况下,我们需要另一种导出配置的方式,因为我们不应手动编辑 mysqld-auto.cnf。
幸运的是,事实证明,导出所有持久变量很容易。
表 performance_schema.persisted_variables 包括自上次重新启动以来已从 mysqld-auto.cnf 读取或者已使用 SET PERSIST 或者 SET PERSIST_ONLY 更改的所有变量。
该表包括持久值。
例如:
mysql> SELECT * FROM performance_schema.persisted_variables; +---------------------+----------------+ | VARIABLE_NAME | VARIABLE_VALUE | +---------------------+----------------+ | sort_buffer_size | 32768 | | join_buffer_size | 131072 | | slave_parallel_type | LOGICAL_CLOCK | +---------------------+----------------+ 3 rows in set (0.01 sec)
这可用于创建可用于在另一个实例上重新创建配置的 SET 语句。
例如:
SELECT CONCAT('SET PERSIST_ONLY ', VARIABLE_NAME, ' = ', IF(VARIABLE_VALUE REGEXP '^([0-9]+|ON|OFF|YES|NO)$', VARIABLE_VALUE, QUOTE(VARIABLE_VALUE)), ';' ) AS SetStmt FROM performance_schema.persisted_variables;
使用 mysql 命令行客户端,我们可以通过使用 -skip-column-names 和 -batch 选项来避免列名和表格式:
$ mysql --skip-column-names --batch \ -e "SELECT CONCAT('SET PERSIST_ONLY ', VARIABLE_NAME, ' = ', IF(VARIABLE_VALUE REGEXP '^([0-9]+|ON|OFF|YES|NO)$', VARIABLE_VALUE, QUOTE(VARIABLE_VALUE)), ';') FROM performance_schema.persisted_variables;" \ > config.sql
注意:在 Microsoft Windows 上,确保所有内容都在一行上并删除反斜杠。
现在文件 config.sql 包含持久变量的导出:
$ cat config.sql SET PERSIST_ONLY sort_buffer_size = 32768; SET PERSIST_ONLY join_buffer_size = 131072; SET PERSIST_ONLY slave_parallel_type = 'LOGICAL_CLOCK';
此示例创建 SET PERSIST_ONLY 语句,因为这些语句适用于所有可持久变量。
当我们重放 SET 语句时,需要重新启动 MySQL 才能使更改生效。
如果我们想尽可能使用 SET PERSIST,那么我们需要考虑变量是否支持 SET PERSIST。
最后包含需要 SET PERSIST_ONLY 的变量列表。
现在可以将配置恢复为:
mysql> SOURCE config.sql Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.01 sec) mysql> RESTART; Query OK, 0 rows affected (0.00 sec)
PERSIST_ONLY 变量
如前所述,某些变量需要重新启动才能使新值生效。
这些必须始终设置为 PERSIST_ONLY。
从没有安装任何插件的 MySQL 8.0.12 开始,需要 PERSIST_ONLY 的变量是:
back_log binlog_gtid_simple_recovery disabled_storage_engines disconnect_on_expired_password ft_max_word_len ft_min_word_len ft_query_expansion_limit innodb_adaptive_hash_index_parts innodb_api_disable_rowlock innodb_api_enable_binlog innodb_api_enable_mdl innodb_autoinc_lock_mode innodb_buffer_pool_chunk_size innodb_buffer_pool_instances innodb_doublewrite innodb_flush_method innodb_force_recovery innodb_ft_aux_table innodb_ft_cache_size innodb_ft_min_token_size innodb_ft_server_stopword_table innodb_ft_sort_pll_degree innodb_ft_total_cache_size innodb_ft_user_stopword_table innodb_log_file_size innodb_log_files_in_group innodb_monitor_disable innodb_monitor_enable innodb_monitor_reset innodb_monitor_reset_all innodb_numa_interleave innodb_open_files innodb_page_cleaners innodb_purge_threads innodb_read_io_threads innodb_rollback_on_timeout innodb_sort_buffer_size innodb_sync_array_size innodb_tmpdir innodb_use_native_aio innodb_write_io_threads large_pages log_slave_updates log_syslog log_syslog_facility log_syslog_include_pid log_syslog_tag lower_case_table_names max_digest_length metadata_locks_cache_size metadata_locks_hash_instances myisam_mmap_size myisam_recover_options mysqlx_bind_address mysqlx_port mysqlx_port_open_timeout mysqlx_socket mysqlx_ssl_ca mysqlx_ssl_capath mysqlx_ssl_cert mysqlx_ssl_cipher mysqlx_ssl_crl mysqlx_ssl_crlpath mysqlx_ssl_key ngram_token_size old open_files_limit performance_schema performance_schema_digests_size performance_schema_error_size performance_schema_events_stages_history_long_size performance_schema_events_stages_history_size performance_schema_events_statements_history_long_size performance_schema_events_statements_history_size performance_schema_events_transactions_history_long_size performance_schema_events_transactions_history_size performance_schema_events_waits_history_long_size performance_schema_events_waits_history_size performance_schema_max_cond_classes performance_schema_max_digest_length performance_schema_max_file_classes performance_schema_max_file_handles performance_schema_max_memory_classes performance_schema_max_mutex_classes performance_schema_max_rwlock_classes performance_schema_max_socket_classes performance_schema_max_sql_text_length performance_schema_max_stage_classes performance_schema_max_statement_classes performance_schema_max_statement_stack performance_schema_max_thread_classes performance_schema_session_connect_attrs_size rbr_exec_mode relay_log_recovery relay_log_space_limit report_host report_password report_port report_user skip_name_resolve skip_show_database slave_skip_errors ssl_cipher table_open_cache_instances thread_handling thread_stack tls_version
mysqld-auto.cnf 和 variables_info
持久化变量使用 JSON 格式存储在数据目录中的文件 mysqld-auto.cnf 中。
它包含的信息不仅仅是持久化的值。
它还包括诸如更改者和更改时间等信息。
一个示例文件是:
$ cat mysqld-auto.cnf { "Version" : 1 , "mysql_server" : { "sort_buffer_size" : { "Value" : "32768" , "Metadata" : { "Timestamp" : 1534230053297668 , "User" : "root" , "Host" : "localhost" } } , "join_buffer_size" : { "Value" : "131072" , "Metadata" : { "Timestamp" : 1534230072956789 , "User" : "root" , "Host" : "localhost" } } , "mysql_server_static_options" : { "slave_parallel_type" : { "Value" : "LOGICAL_CLOCK" , "Metadata" : { "Timestamp" : 1534230099583642 , "User" : "root" , "Host" : "localhost" } } } } }
由于它是 JSON,因此很容易重新格式化以使其更易于阅读,例如:
$ cat mysqld-auto.cnf | python -m json.tool { "Version": 1, "mysql_server": { "join_buffer_size": { "Metadata": { "Host": "localhost", "Timestamp": 1534230072956789, "User": "root" }, "Value": "131072" }, "mysql_server_static_options": { "slave_parallel_type": { "Metadata": { "Host": "localhost", "Timestamp": 1534230099583642, "User": "root" }, "Value": "LOGICAL_CLOCK" } }, "sort_buffer_size": { "Metadata": { "Host": "localhost", "Timestamp": 1534230053297668, "User": "root" }, "Value": "32768" } } }
此信息也可从 performance_schema.variables_info 表中获得:
mysql> SELECT VARIABLE_NAME, VARIABLE_SOURCE, sys.format_path(VARIABLE_PATH) AS Path, SET_TIME, SET_USER, SET_HOST FROM performance_schema.variables_info WHERE VARIABLE_NAME IN ('join_buffer_size', 'slave_parallel_type', 'sort_buffer_size'); +---------------------+-----------------+-------------------------------------------+----------------------------+----------+-----------+ | VARIABLE_NAME | VARIABLE_SOURCE | Path | SET_TIME | SET_USER | SET_HOST | +---------------------+-----------------+-------------------------------------------+----------------------------+----------+-----------+ | join_buffer_size | DYNAMIC | | 2018-08-14 17:08:15.526750 | root | localhost | | slave_parallel_type | PERSISTED | @@datadir/mysqld-auto.cnf/mysqld-auto.cnf | 2018-08-14 17:01:39.583642 | root | localhost | | sort_buffer_size | PERSISTED | @@datadir/mysqld-auto.cnf | 2018-08-14 17:00:53.297668 | root | localhost | +---------------------+-----------------+-------------------------------------------+----------------------------+----------+-----------+ 3 rows in set (0.36 sec)
请注意, join_buffer_size 的来源是 DYNAMIC 而其他两个变量的来源设置为 PERSISTED 。
为什么?
毕竟它们三个都存在于 mysqld-auto.cnf 文件中。
DYNAMIC 表示自上次使用 SET GLOBAL 或者 SET PERSIST 重新启动以来,变量发生了变化。
另一件要注意的事情是,使用 SET PERSIST_ONLY 更改的变量在下次重新启动之前不会出现在 variables_info 中。
我们很快就会看到 get 以一种或者另一种方式持久化的变量。
持久变量
我们可以使用 SET PERSIST 或者 SET PERSIST_ONLY 语句保留更改。
不同的是 SET PERSIST_ONLY 只更新配置,而 SET PERSIST 本质上结合了 SET GLOBAL 和 SET PERSIST_ONLY 。
MySQL 8.0 引入了一项新功能,允许我们从 MySQL 内部保留配置更改。
以前,我们可以在运行时执行“SET GLOBAL”来更改配置,但我们需要更新 MySQL 配置文件以保持更改。
在 MySQL 8.0 中,我们可以跳过第二步。
这篇文章讨论了它的工作原理以及如何备份和恢复配置。