欢迎来到之路教程(on itroad-com)

备份还原

备份配置的一种简单方法是将 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 8.0 引入了一项新功能,允许我们从 MySQL 内部保留配置更改。
以前,我们可以在运行时执行“SET GLOBAL”来更改配置,但我们需要更新 MySQL 配置文件以保持更改。
在 MySQL 8.0 中,我们可以跳过第二步。
这篇文章讨论了它的工作原理以及如何备份和恢复配置。

日期:2020-09-17 00:11:25 来源:oir作者:oir