[client] port = 3306 socket = /home/work/mysql_3306/tmp/mysql.sock [mysqld] user = work port = 3306 basedir = /home/work/mysql_3306 datadir = /home/work/mysql_3306/data tmpdir = /home/work/mysql_3306/tmp socket = /home/work/mysql_3306/tmp/mysql.sock pid_file = /home/work/mysql_3306/tmp/mysql.pid log-error = /home/work/mysql_3306/log/mysql.err general_log = /home/work/mysql_3306/log/mysql.log slow_query_log_file = /home/work/mysql_3308/log/slow.log log-bin = /home/work/mysql_3306/log/mysql-bin plugin_dir = /home/work/mysql/lib/mysql/plugin default-time-zone = "+08:00" thread_handling = pool-of-threads # 这个参数在windows版本上没有这个参数 thread_pool_stall_limit = 50 # 这个参数在windows版本上没有这个参数 thread_pool_oversubscribe = 20 # 这个参数在windows版本上没有这个参数 performance_schema = 1 log_slave_updates log_timestamps = SYSTEM log_warnings slow_query_log long_query_time = 0.5 lock_wait_timeout = 120 show_compatibility_56 = on sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' table_open_cache_instances = 16 ################################## enforce_storage_engine = InnoDB #在windows上是default-storage-engine=INNODB optimizer_switch='index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,subquery_materialization_cost_based=on,use_index_extensions=on' super_read_only = off log_slow_slave_statements = on log_slow_admin_statements = on log_slow_verbosity = 'full' slow_query_log_use_global_control = "long_query_time" event-scheduler = off back_log = 1000 skip_name_resolve max_connections = 10240 max_user_connections = 4000 max_connect_errors = 1000 extra_max_connections = 3 # 这个参数在windows版本上没有这个参数 extra_port = 13308 table_open_cache = 8192 table_definition_cache = 65535 max_allowed_packet = 64M expire_logs_days = 7 max_heap_table_size = 1024M read_rnd_buffer_size = 512K group_concat_max_len = 1024000 sort_buffer_size = 256K read_buffer_size = 64K join_buffer_size = 128K thread_cache_size = 256 ft_min_word_len = 4 default-storage-engine = INNODB thread_stack = 192K transaction_isolation = REPEATABLE-READ tmp_table_size = 1024M open_files_limit = 65536 key_buffer_size = 32M bulk_insert_buffer_size = 64M myisam_sort_buffer_size = 128M myisam_max_sort_file_size = 1G myisam_repair_threads = 1 max_allowed_packet = 64M max_prepared_stmt_count = 1000000 #----------------------------------------------------------------- #replication server-id = 4545454545 binlog_rows_query_log_events = on log-slave-updates = 1 relay-log = relay-bin #这个参数一般用在主主同步中,用来错开自增值, 防止键值冲突 #auto_increment_offset = 1 #这个参数一般用在主主同步中,用来错开自增值, 防止键值冲突 # auto_increment_increment = 1 #####################必须集群内互相兼容,建议全都保持一致并为 row binlog_format = row
# Last_IO_Error: Got fatal error 1236 from master when reading data from binary log:Slave can not handle replication events with the checksum that master is configured to log;
# the first event ‘mysql-bin.000001’ at 451, the last event read from ‘./mysql-bin.000001’ at 451, the last byte read from ‘./mysql-bin.000001’ at 120.’ # 这就是binlog_checksum变量设置成none的原因,以免因为主从数据库的版本不一致出现这个错误。
binlog_checksum = none
binlog_cache_size = 16M max_binlog_cache_size = 2G sync_binlog = 1 master_info_repository = TABLE relay_log_info_repository = TABLE relay_log_recovery = on sync_master_info = 10000 sync_relay_log_info = 10000 sync_relay_log = 0 #slave_net_timeout = 4 #slave-parallel-type = LOGICAL_CLOCK #slave-parallel-workers = 16 slave_pending_jobs_size_max = 134217728 slave_preserve_commit_order = 0
#################################
## 下面这两个搞不好会导致启动失败,搞清楚原理再使用 #transaction_write_set_extraction = XXHASH64 #binlog_transaction_dependency_tracking = WRITESET #####################MySQL5.7.7之后,默认改成60秒。该参数定义了从库从主库获取数据等待的秒数,超过这个时间从库会主动退出读取,中断连接,并尝试重连。 #slave_net_timeout=8 ###############mysql版本在5.6之后才有该选项。 gtid_mode = on ###############mysql版本在5.6之后才有该选项。 enforce-gtid-consistency = on # ##############################################################################################半同步复制插件,需要安装。mysql5.7版本之后才有。 ##########################################。安装插件在主库上:install plugin rpl_semi_sync_master soname 'semisync_master.so'; --安装 semisync_master.so插件 ##########################################。安装插件在从库上:install plugin rpl_semi_sync_slave soname 'semisync_slave.so'; --安装 semisync_slave.so插件 #plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so" ################################半同步复制插件,需要安装。mysql5.7版本之后才有。 #rpl_semi_sync_master_enabled = on ################################半同步复制插件,需要安装。mysql5.7版本之后才有。 #rpl_semi_sync_slave_enabled = on ################################半同步复制插件,需要安装。mysql5.7版本之后才有。 #rpl_semi_sync_master_wait_for_slave_count = 1 ################################半同步复制插件,需要安装。mysql5.7版本之后才有。 #rpl_semi_sync_master_timeout = 1000 ################################半同步复制插件,需要安装。mysql5.7版本之后才有。 #rpl_semi_sync_master_wait_point = after_sync #undo innodb_max_undo_log_size = 1024M innodb_undo_log_truncate = on innodb_undo_logs = 128 innodb_undo_tablespaces = 3 #只能在初始化的时候设置 innodb_purge_rseg_truncate_frequency = 128 #innodb innodb_autoextend_increment = 64 innodb_concurrency_tickets = 5000 innodb_old_blocks_time = 1000 innodb_purge_batch_size = 300 innodb_stats_on_metadata = off innodb_thread_sleep_delay = 10000 innodb_adaptive_max_sleep_delay = 15000 innodb_buffer_pool_dump_at_shutdown = on innodb_buffer_pool_load_at_startup = on innodb_flush_neighbors = 1 ############################nnoDB使用后台线程处理数据页上写 I/O(输入)请求的数量。 innodb_write_io_threads = 8 ############################InnoDB使用后台线程处理数据页上读 I/O(输出)请求的数量。这里输出是输入的两倍。 innodb_read_io_threads = 16 innodb_print_all_deadlocks = on innodb_buffer_pool_size = 30G innodb_buffer_pool_instances = 8 innodb_data_file_path = ibdata1:100M:autoextend # 这个参数在windows版本上没有这个参数 innodb_thread_concurrency = 48 innodb_flush_log_at_trx_commit = 1 innodb_log_buffer_size = 64M ############################该值表示每个redo log文件大小,该值大小约为该mysql实例一个小时产生的日志大小,这里设置为4G,ib_logfile0和ib_logfile1文件都是4G,逻辑上ib_logfile被当成了一个文件。循环写入。 innodb_log_file_size = 4096M #############################配置redo log成多个文件,Redo log文件以ib_logfile[number]命名,日志目录通过参数innodb_log_group_home_dir控制,以顺序的方式写入文件文件,写满时则回溯到第一个文件,进行覆盖写。 innodb_log_files_in_group = 3 ###############################控制了 Dirty Page 在 Buffer Pool 中所占的比率。 innodb_max_dirty_pages_pct = 75 innodb_max_dirty_pages_pct_lwm = 10 innodb_flush_method = O_DIRECT # 在windows上不行 innodb_lock_wait_timeout = 10
#innodb_file_per_table参数必须设置为1,否则xtrabackup工具无法单独备份某一个数据库。 innodb_file_per_table = 1 innodb_purge_threads = 4 #########################该参数表示缓冲区刷新到磁盘时,刷新脏页数量。普通单个SATA可以设置200,对于SSD可以设置3000到5000,而拥有5个磁盘组成的RAID5可以设置成2000。 innodb_io_capacity = 5000 innodb_open_files = 65535 innodb_online_alter_log_max_size = 5120M innodb_sort_buffer_size = 4M innodb_adaptive_hash_index_parts = 8 innodb_buffer_pool_chunk_size = 128 innodb_buffer_pool_dump_pct = 80 innodb_deadlock_detect = on innodb_default_row_format = DYNAMIC innodb_fill_factor = 100 innodb_flush_sync = off innodb_log_checksums = on innodb_log_write_ahead_size = 8192 innodb_max_undo_log_size = 1073741824 innodb_page_cleaners = 4 innodb_purge_rseg_truncate_frequency = 128 innodb_temp_data_file_path = ibtmp1:12M:autoextend innodb_print_lock_wait_timeout_info = on #在windows上不行
一. innodb_flush_log_at_trx_commit
是指:ib_logfile的刷新方式( ib_logfile:记录的是redo log和undo log的信息,是重做日志写入磁盘的过程。用来控制缓冲区中的数据写入到日志文件,以及日志文件数据刷新到磁盘(flush)的操作时机。对这个参数的设置值,可以对数据库在性能与数据安全之间,进行折中。
参数值解释:
当参数是0:日志缓冲数据会,每秒一次地写入到日志文件,并且把日志文件刷新到磁盘操作。该模式下在事务提交的时候,不会主动触发写入磁盘的操作。
当参数是1:每次事务提交时,日志缓冲被写到日志文件,并且对日志文件做磁盘刷新操作,该模式为系统默认。但由于每次事务都需要进行磁盘I/O,所以也最慢。
当参数是2:每次事务提交时,日志缓冲被写到日志文件,但不对日志文件做磁盘刷新操作。对日志文件每秒执行一次,刷到磁盘操作。
当设置innodb_flush_log_at_trx_commit=1时, 是默认值,也是最安全的设置,但是在这种模式下性能有一定的损失。 如果设置成0或者2 性能会有所改善,但有数据丢失的风险。
设置成0则数据库崩溃的时候,那些没有被写入日志文件的事务丢失,最多丢失1秒钟的事务,是最不安全的,但也是效率最高的。
设置成2则只是没有刷新到磁盘,但已经写入日志文件,所以只要操作系统没有崩溃, 那么并没有数据丢失, 比设置成0更安全。
在mysql官方中为了确保事务的持久性和复制设置的一致性,都是建议将这个参数值设置为1;
对于一些数据一致性和完整性要求不高的应用,配置为 2 就足够了;
如果为了最高性能,可以设置为 0。
有些应用,如支付服务,对一致性和完整性要求很高,所以即使最慢,也最好设置为 1。
参数值 |
数据安全性 |
I/O性能 |
0 |
安全最差。当数据库崩溃,有丢失1秒钟的事务风险 |
最优 |
1 |
安全最好。无丢失数据 |
最差 |
2 |
安全折中。当操作系统崩溃, 有丢失1秒钟的事务风险 |
折中 |
1.1 查看日志提交方式
SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';
1.2 修改参数值
还是一样找到my.cnf, 修改参数值
[root@xuegod64 ~]# cd /etc
[root@xuegod64 etc]# vim my.cnf
[root@xuegod64 ~]# systemctl stop mysqld.service
[root@xuegod64 ~]# systemctl start mysqld.service
-- 再次查看
SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';
二. sync_binlog
是二进制Binlog文件, 这个参数是对于MySQL系统来说是至关重要的,他不仅影响到Binlog对MySQL所带来的性能损耗,而且还影响到MySQL中数据的完整性。在MySQL中系统默认的设置是sync_binlog=1。对于“sync_binlog”参数的各种设置的说明如下:
1)sync_binlog = 0:当事务提交之后,不主动刷新二进制日志文件的数据到磁盘上,而是由操作系统决定。
2)sync_binlog = 1:每当事务提交之后,主动刷新二进制日志文件的数据到磁盘上是最安全但是性能损耗最大的设置。因为当设置为1的时候,即使系统Crash,也最多丢失binlog_cache中未完成的一个事务,对实际数据没有任何实质性影响。。
3)sync_binlog > 1:每向二进制日志文件写入N条SQL或N个事务后,则把二进制日志文件的数据刷新到磁盘上。
-- 查看binlog写入方式 SHOW VARIABLES LIKE 'sync_binlog';
# 在线更改参数 set global sync_binlog = 1000;
总结: 在数据安全与性能以日志文件作为出发点时,我认为功能上与sql server 的数据恢复模式比较相像,但实现的思路是不一样的。
innodb_flush_log_at_trx_commit和sync_binlog是MySQL innodb引擎的两个重要的参数,其中innodb_flush_log_at_trx_commit是将事务日志从innodb log buffer刷新到磁盘,sync_binlog是将二进制日志文件刷新到磁盘上。
innodb_flush_log_at_trx_commit和sync_binlog 两个参数是控制MySQL 磁盘写入策略以及数据安全性的关键参数,当两个参数都设置为1的时候写入性能最差,
网上也有说将innodb_flush_log_at_trx_commit=2,sync_binlog=500
或1000。有说对于高并发事务的系统来说,“sync_binlog”设置为0和设置为1的系统写入性能差距可能高达5倍甚至更多。总体上还是要根据业务来判断,在性能和安全上做个选择。
1. innodb_lock_wait_timeout
mysql 可以自动监测行锁导致的死锁并进行相应的处理,但是对于表锁导致的死锁不能自动监测,所以该参数主要用于,出现类似情况的时候等待指定的时间后回滚。系统默认值是50秒。用户可以根据业务自行设置。生产环境不推荐使用过大的 innodb_lock_wait_timeout 参数值。
-- 查看事务超时时间
SHOW VARIABLES LIKE 'innodb_lock_wait_timeout';
也可以对当前会话进行超时设置如: set innodb_lock_wait_timeout=1000。关于产生死锁的原因,如何查看分析死锁问题, 如何优化尽量避免死锁,请查看"mysql 开发进阶篇 锁问题系列"。
2. innodb_support_xa
通过该参数设置,是否支持分布式事务。默认值是ON或者1,表示支持分布式事务。
分布事事务分两类:
(1)是外部xa事务(支持多实例分布式事务)。
(2)是支持内部xa事务(支持binlog和redo_log之间数据一致性)。
如果关闭这个参数,据前辈们说可能会影响到:1是主从复制binlog与redo_log不一致,2是binlog与redo_log事务顺序不一致性。
-- 查看是否支持分布式事务
SHOW VARIABLES LIKE 'innodb_support_xa';
3. innodb _log_buffer_size
这个参数是指日志缓存的大小。默认的设置在中等强度写入负载以及较短事务的情况下,一般都可以满足服务器的性能要求。如果存在更新操作峰值或者负载较大,就应该考虑加大它的值。 如果值设置太高,可能会浪费内存,因为它每秒都会刷新一次,因此无需设置超过1秒所需的内存空间(理解是每1秒刷新后,日志缓存会清空)。通常设置为8~16MB就足够了。系统默认是16M。
-- 查看日志缓存空间大小
SHOW VARIABLES LIKE 'innodb_log_buffer_size';
16777216.0/1024.0/1024.0=16M
4. innodb_log_file_size
这个参数是一个日志组(log group)中每个日志文件的大小,也叫事务日志文件大小。此参数在高写入负载尤其是大数据集的情况下很重要.这个值越大则性能相对越高,但副作用是当系统发生灾难时恢复时间会加大。系统默认是48M。
(1)
小日志文件使写入速度更慢,崩溃恢复速度更快。原因是由于事务日志相当于一个写缓冲,而小日志文件会很快的被写满,这时候就需要频繁地刷新到硬盘,速度就慢了。如果产生大量的写操作,会增加checkpoint写的次数,如果不能足够快地刷新数据,那么写性能将会降低,。相反文件空间大,在刷新操作发生之前给你足够的空间来使用。
(2) 大日志文件使写入更快,崩溃恢复速度更慢。
-- 查看每个日志文件的大小
SHOW VARIABLES LIKE 'innodb_log_file_size';
268435456.0/1024.0/1024.0=256M
5. innodb_log_compressed_pages
这个参数是指:日志文件页存储压缩。系统默认是ON , 将减少redo log的写入量。
6. innodb_log_checksums
这个参数是指:写入redo log到文件之前,redo log的每一个block都需要加上checksum校验位,以防止apply损坏redo log。
7. innodb_log_write_ahead_size
这个参数是指: redo log写前的块大小。系统默认是8192字节。
8. innodb_log_files_in_group
这个参数是指:该变量控制日志文件数。默认值为3。日志是以顺序的方式写入。结合innodb_buffer_pool_size设置其大小。一般不用设置。
9. innodb_log_group_home_dir
这个参数是指:日志组所在的路径。
-- 所有日志参数如下
SHOW VARIABLES LIKE 'innodb_log%';
mysql8版本的配置
my.cnf
cat my.cnf
[client]
port=3306
socket=/home/work/ssd1/mysql-8.0.18-linux-glibc2.12-x86_64/mysql-clinet.sock
[mysqld]
default_password_lifetime=0
#skip-grant-tables
user=work
# disable_ssl
skip_ssl
default_authentication_plugin=mysql_native_password
innodb_buffer_pool_size=5GB
datadir=/home/work/ssd1/mysql-8.0.18-linux-glibc2.12-x86_64/data
basedir=/home/work/ssd1/mysql-8.0.18-linux-glibc2.12-x86_64
log-error=/home/work/ssd1/mysql-8.0.18-linux-glibc2.12-x86_64/log/mysql.err
log-bin = /home/work/ssd1/mysql-8.0.18-linux-glibc2.12-x86_64/log/mysql-bin
binlog_format = ROW
server-id = 123456
slow_query_log_file = /home/work/ssd1/mysql-8.0.18-linux-glibc2.12-x86_64/log/slow.log
long_query_time = 0.5
lock_wait_timeout = 120
pid_file=/home/work/ssd1/mysql-8.0.18-linux-glibc2.12-x86_64/mysql.pid
socket=/home/work/ssd1/mysql-8.0.18-linux-glibc2.12-x86_64/mysql.sock
port=3306