zoukankan      html  css  js  c++  java
  • redolog 大小的实验

    前言:近日因工作需要,测试postgresql和MySQL在oltp对比测试,因结果差异太多(MySQL测试结果比较差,相同环境),寻求大神帮助,有幸得叶大师和姜大师指点,指出my.cnf配置文件innodb_log_file_size不合理(在以前的资料提示Innodb,redolog大小一般都建议128-512M大小,不然崩溃恢复将会很漫长),redolog越大,checkpoint就越少,tps相对越高,MySQL5.6redolog 大小可以超过4G,下面就测试一下不同redolog大小奔溃恢复时间

    测试环境:硬件是VM,系统是centos6.6 4核4G内存,宿主硬盘是Intel SSD,测试表数据为1千万行,测试工具为sysbench0.5版本,测试方法是压力测试工具进行压力测试,然后暴力kill MySQL

    跟日志相关参数:

    innodb_flush_log_at_trx_commit = 1
    innodb_log_buffer_size = 32M
    innodb_log_file_size = 4096M(分别测试1G,2G,4G)
    innodb_log_files_in_group = 2
    innodb_max_dirty_pages_pct = 70

    IO性能:因为结果出乎人意料我不得不先把我自己IO能力测试出来

    16k随机读写IO,读写比例为:40:60 IOPS=2951

    fio -filename=/data/fiotest -direct=1  -rw=randrw -ioengine=libaio -rwmixwrite=60
    > -bs=16k -size=8G -numjobs=64 -runtime=600 -group_reporting -name=mytest

     read : io=27676MB, bw=47231KB/s, iops=2951, runt=600025msec

    8k随机读写IO,读写比例为:40:60 IOPS=2951

    fio -filename=/data/fiotest -direct=1  -rw=randrw -ioengine=libaio -rwmixwrite=60

    > -bs=8k -size=8G -numjobs=64 -runtime=600 -group_reporting -name=mytest

      write: io=18155MB, bw=30983KB/s, iops=3872, runt=600046msec

    4K随机读写IO  读写比例为:40:60 IOPS=3590

    fio -filename=/data/fiotest -direct=1  -rw=randrw -ioengine=libaio -rwmixwrite=60
    > -bs=4k -size=8G -numjobs=64 -runtime=600 -group_reporting -name=mytest

     read : io=8416.6MB, bw=14363KB/s, iops=3590, runt=600030msec

    【1】测试方法

    1.1 创建测试表

    ./sysbench --mysql-host=192.168.80.106 --mysql-user=sysbench --mysql-password=123456 --mysql-db=sysbench --test=/opt/sysbench/tests/db/oltp.lua --oltp_tables_count=10 --oltp-table-size=1000000 --rand-init=on prepare

    1.2 进行测试,其中一个会话在做压力测试,一个会话暴力杀掉MySQL sleep 300; pkill -9 mysqld

    ./sysbench --mysql-host=192.168.80.106 --mysql-port=3306 --mysql-user=sysbench --mysql-password=123456 --test=/opt/sysbench/tests/db/oltp.lua --oltp_tables_count=10 --oltp-table-size=10000000 --num-threads=64-oltp-read-only=off --report-interval=10 --rand-type=uniform --max-time=1200  --mysql-db=sysbench --max-requests=0 --percentile=99 run

    【2】测试结果

    2.1 innodb_log_file_size = 1024M

    150607 11:29:41 mysqld_safe Starting mysqld daemon with databases from /data/mydata
    2015-06-07 11:29:41 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
    2015-06-07 11:29:41 8144 [Note] Plugin 'FEDERATED' is disabled.
    2015-06-07 11:29:41 7f80332d07e0 InnoDB: Warning: Using innodb_additional_mem_pool_size is DEPRECATED. This option may be removed in future releases, together with the option innodb_use_sys_malloc and with the InnoDB's internal memory allocator.
    2015-06-07 11:29:41 8144 [Note] InnoDB: Using atomics to ref count buffer pool pages
    2015-06-07 11:29:41 8144 [Note] InnoDB: The InnoDB memory heap is disabled
    2015-06-07 11:29:41 8144 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
    2015-06-07 11:29:41 8144 [Note] InnoDB: Memory barrier is not used
    2015-06-07 11:29:41 8144 [Note] InnoDB: Compressed tables use zlib 1.2.3
    2015-06-07 11:29:41 8144 [Note] InnoDB: Using Linux native AIO
    2015-06-07 11:29:41 8144 [Note] InnoDB: Using CPU crc32 instructions
    2015-06-07 11:29:41 8144 [Note] InnoDB: Initializing buffer pool, size = 2.0G
    2015-06-07 11:29:41 8144 [Note] InnoDB: Completed initialization of buffer pool
    2015-06-07 11:29:41 8144 [Note] InnoDB: Highest supported file format is Barracuda.
    2015-06-07 11:29:41 8144 [Note] InnoDB: Log scan progressed past the checkpoint lsn 3383367251
    2015-06-07 11:29:41 8144 [Note] InnoDB: Database was not shutdown normally!
    2015-06-07 11:29:41 8144 [Note] InnoDB: Starting crash recovery.
    2015-06-07 11:29:41 8144 [Note] InnoDB: Reading tablespace information from the .ibd files...
    2015-06-07 11:29:42 8144 [Note] InnoDB: Restoring possible half-written data pages 
    2015-06-07 11:29:42 8144 [Note] InnoDB: from the doublewrite buffer...
    InnoDB: Doing recovery: scanned up to log sequence number 3388610048
    InnoDB: Doing recovery: scanned up to log sequence number 3393852928
    InnoDB: Doing recovery: scanned up to log sequence number 3399095808
    InnoDB: Doing recovery: scanned up to log sequence number 3404338688
    InnoDB: Doing recovery: scanned up to log sequence number 3409581568
    InnoDB: Doing recovery: scanned up to log sequence number 3414824448
    InnoDB: Doing recovery: scanned up to log sequence number 3420067328
    InnoDB: Doing recovery: scanned up to log sequence number 3425310208
    InnoDB: Doing recovery: scanned up to log sequence number 3430553088
    InnoDB: Doing recovery: scanned up to log sequence number 3435795968
    InnoDB: Doing recovery: scanned up to log sequence number 3441038848
    InnoDB: Doing recovery: scanned up to log sequence number 3446281728
    InnoDB: Doing recovery: scanned up to log sequence number 3446339459
    InnoDB: Transaction 419763 was in the XA prepared state.
    InnoDB: 4 transaction(s) which must be rolled back or cleaned up
    InnoDB: in total 4 row operations to undo
    InnoDB: Trx id counter is 420096
    2015-06-07 11:29:43 8144 [Note] InnoDB: Starting an apply batch of log records to the database...
    InnoDB: Progress in percent: 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 
    InnoDB: Apply batch completed
    InnoDB: Last MySQL binlog file position 0 67898783, file name dg6-logbin.000007
    2015-06-07 11:29:51 8144 [Note] InnoDB: 128 rollback segment(s) are active.
    2015-06-07 11:29:51 8144 [Note] InnoDB: Waiting for purge to start
    InnoDB: Starting in background the rollback of uncommitted transactions
    2015-06-07 11:29:51 7f7f6dde8700  InnoDB: Rolling back trx with id 419767, 1 rows to undo
    2015-06-07 11:29:51 8144 [Note] InnoDB: Rollback of trx with id 419767 completed
    2015-06-07 11:29:51 7f7f6dde8700  InnoDB: Rolling back trx with id 419764, 1 rows to undo
    2015-06-07 11:29:51 8144 [Note] InnoDB: Rollback of trx with id 419764 completed
    2015-06-07 11:29:51 7f7f6dde8700  InnoDB: Rolling back trx with id 419762, 2 rows to undo
    2015-06-07 11:29:51 8144 [Note] InnoDB: Rollback of trx with id 419762 completed
    2015-06-07 11:29:51 7f7f6dde8700  InnoDB: Rollback of non-prepared transactions completed
    2015-06-07 11:29:51 8144 [Note] InnoDB:  Percona XtraDB (http://www.percona.com) 5.6.21-rel70.1 started; log sequence number 3446339459
    2015-06-07 11:29:51 8144 [Note] Recovering after a crash using dg6-logbin
    2015-06-07 11:29:52 8144 [Note] Starting crash recovery...
    2015-06-07 11:29:52 7f80332d07e0  InnoDB: Starting recovery for XA transactions...
    2015-06-07 11:29:52 7f80332d07e0  InnoDB: Transaction 419763 in prepared state after recovery
    2015-06-07 11:29:52 7f80332d07e0  InnoDB: Transaction contains changes to 1 rows
    2015-06-07 11:29:52 7f80332d07e0  InnoDB: 1 transactions in prepared state after recovery
    2015-06-07 11:29:52 8144 [Note] Found 1 prepared transaction(s) in InnoDB
    2015-06-07 11:29:52 8144 [Note] Crash recovery finished.
    /opt/app/mysql/bin/mysqld: Found a Gtid_log_event or Previous_gtids_log_event when @@GLOBAL.GTID_MODE = OFF.
    /opt/app/mysql/bin/mysqld: Found a Gtid_log_event or Previous_gtids_log_event when @@GLOBAL.GTID_MODE = OFF.
    2015-06-07 11:29:52 8144 [Note] RSA private key file not found: /data/mydata//private_key.pem. Some authentication plugins will not work.
    2015-06-07 11:29:52 8144 [Note] RSA public key file not found: /data/mydata//public_key.pem. Some authentication plugins will not work.
    2015-06-07 11:29:52 8144 [Note] Server hostname (bind-address): '*'; port: 3306
    2015-06-07 11:29:52 8144 [Note] IPv6 is available.
    2015-06-07 11:29:52 8144 [Note]   - '::' resolves to '::';
    2015-06-07 11:29:52 8144 [Note] Server socket created on IP: '::'.
    2015-06-07 11:29:52 8144 [Warning] 'user' entry 'root@dg1' ignored in --skip-name-resolve mode.
    2015-06-07 11:29:52 8144 [Warning] 'proxies_priv' entry '@ root@dg1' ignored in --skip-name-resolve mode.
    2015-06-07 11:29:52 8144 [Note] Event Scheduler: Loaded 0 events
    2015-06-07 11:29:52 8144 [Note] /opt/app/mysql/bin/mysqld: ready for connections.
    Version: '5.6.21-70.1-log'  socket: '/tmp/mysql.sock'  port: 3306  Percona Server (GPL), Release 70.1, Revision 698

    看到木有恢复时间才十几秒钟呢

    2.2 innodb_log_file_size = 2048M

    150607 11:41:29 mysqld_safe Starting mysqld daemon with databases from /data/mydata
    2015-06-07 11:41:29 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
    2015-06-07 11:41:29 9675 [Note] Plugin 'FEDERATED' is disabled.
    2015-06-07 11:41:29 7f599fd1c7e0 InnoDB: Warning: Using innodb_additional_mem_pool_size is DEPRECATED. This option may be removed in future releases, together with the option innodb_use_sys_malloc and with the InnoDB's internal memory allocator.
    2015-06-07 11:41:29 9675 [Note] InnoDB: Using atomics to ref count buffer pool pages
    2015-06-07 11:41:29 9675 [Note] InnoDB: The InnoDB memory heap is disabled
    2015-06-07 11:41:29 9675 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
    2015-06-07 11:41:29 9675 [Note] InnoDB: Memory barrier is not used
    2015-06-07 11:41:29 9675 [Note] InnoDB: Compressed tables use zlib 1.2.3
    2015-06-07 11:41:29 9675 [Note] InnoDB: Using Linux native AIO
    2015-06-07 11:41:29 9675 [Note] InnoDB: Using CPU crc32 instructions
    2015-06-07 11:41:29 9675 [Note] InnoDB: Initializing buffer pool, size = 2.0G
    2015-06-07 11:41:30 9675 [Note] InnoDB: Completed initialization of buffer pool
    2015-06-07 11:41:30 9675 [Note] InnoDB: Highest supported file format is Barracuda.
    2015-06-07 11:41:30 9675 [Note] InnoDB: Log scan progressed past the checkpoint lsn 3446441494
    2015-06-07 11:41:30 9675 [Note] InnoDB: Database was not shutdown normally!
    2015-06-07 11:41:30 9675 [Note] InnoDB: Starting crash recovery.
    2015-06-07 11:41:30 9675 [Note] InnoDB: Reading tablespace information from the .ibd files...
    2015-06-07 11:41:30 9675 [Note] InnoDB: Restoring possible half-written data pages 
    2015-06-07 11:41:30 9675 [Note] InnoDB: from the doublewrite buffer...
    InnoDB: Doing recovery: scanned up to log sequence number 3451684352
    InnoDB: Doing recovery: scanned up to log sequence number 3456927232
    InnoDB: Doing recovery: scanned up to log sequence number 3462170112
    InnoDB: Doing recovery: scanned up to log sequence number 3467412992
    InnoDB: Doing recovery: scanned up to log sequence number 3472655872
    InnoDB: Doing recovery: scanned up to log sequence number 3477898752
    InnoDB: Doing recovery: scanned up to log sequence number 3483141632
    InnoDB: Doing recovery: scanned up to log sequence number 3488384512
    InnoDB: Doing recovery: scanned up to log sequence number 3493627392
    InnoDB: Doing recovery: scanned up to log sequence number 3498870272
    InnoDB: Doing recovery: scanned up to log sequence number 3504113152
    InnoDB: Doing recovery: scanned up to log sequence number 3505201579
    InnoDB: Transaction 505147 was in the XA prepared state.
    InnoDB: 2 transaction(s) which must be rolled back or cleaned up
    InnoDB: in total 1 row operations to undo
    InnoDB: Trx id counter is 505600
    2015-06-07 11:41:31 9675 [Note] InnoDB: Starting an apply batch of log records to the database...
    InnoDB: Progress in percent: 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 
    InnoDB: Apply batch completed
    InnoDB: Last MySQL binlog file position 0 61317041, file name dg6-logbin.000009
    2015-06-07 11:41:40 9675 [Note] InnoDB: 128 rollback segment(s) are active.
    2015-06-07 11:41:40 9675 [Note] InnoDB: Waiting for purge to start
    InnoDB: Starting in background the rollback of uncommitted transactions
    2015-06-07 11:41:40 7f58dd9c2700  InnoDB: Rolling back trx with id 505160, 1 rows to undo
    2015-06-07 11:41:40 9675 [Note] InnoDB: Rollback of trx with id 505160 completed
    2015-06-07 11:41:40 7f58dd9c2700  InnoDB: Rollback of non-prepared transactions completed
    2015-06-07 11:41:40 9675 [Note] InnoDB:  Percona XtraDB (http://www.percona.com) 5.6.21-rel70.1 started; log sequence number 3505201579
    2015-06-07 11:41:40 9675 [Note] Recovering after a crash using dg6-logbin
    2015-06-07 11:41:40 9675 [Note] Starting crash recovery...
    2015-06-07 11:41:40 7f599fd1c7e0  InnoDB: Starting recovery for XA transactions...
    2015-06-07 11:41:40 7f599fd1c7e0  InnoDB: Transaction 505147 in prepared state after recovery
    2015-06-07 11:41:40 7f599fd1c7e0  InnoDB: Transaction contains changes to 1 rows
    2015-06-07 11:41:40 7f599fd1c7e0  InnoDB: 1 transactions in prepared state after recovery
    2015-06-07 11:41:40 9675 [Note] Found 1 prepared transaction(s) in InnoDB
    2015-06-07 11:41:40 9675 [Note] Crash recovery finished.
    /opt/app/mysql/bin/mysqld: Found a Gtid_log_event or Previous_gtids_log_event when @@GLOBAL.GTID_MODE = OFF.
    /opt/app/mysql/bin/mysqld: Found a Gtid_log_event or Previous_gtids_log_event when @@GLOBAL.GTID_MODE = OFF.
    2015-06-07 11:41:40 9675 [Note] RSA private key file not found: /data/mydata//private_key.pem. Some authentication plugins will not work.
    2015-06-07 11:41:40 9675 [Note] RSA public key file not found: /data/mydata//public_key.pem. Some authentication plugins will not work.
    2015-06-07 11:41:40 9675 [Note] Server hostname (bind-address): '*'; port: 3306
    2015-06-07 11:41:40 9675 [Note] IPv6 is available.
    2015-06-07 11:41:40 9675 [Note]   - '::' resolves to '::';
    2015-06-07 11:41:40 9675 [Note] Server socket created on IP: '::'.
    2015-06-07 11:41:40 9675 [Warning] 'user' entry 'root@dg1' ignored in --skip-name-resolve mode.
    2015-06-07 11:41:40 9675 [Warning] 'proxies_priv' entry '@ root@dg1' ignored in --skip-name-resolve mode.
    2015-06-07 11:41:40 9675 [Note] Event Scheduler: Loaded 0 events
    2015-06-07 11:41:40 9675 [Note] /opt/app/mysql/bin/mysqld: ready for connections.
    Version: '5.6.21-70.1-log'  socket: '/tmp/mysql.sock'  port: 3306  Percona Server (GPL), Release 70.1, Revision 698

    不科学呀,还是十几秒,那么我们改成4G,让压测运行时间更长一点,900秒以后在kill

    2.3 innodb_log_file_size = 4096M

    150607 12:06:18 mysqld_safe Starting mysqld daemon with databases from /data/mydata
    2015-06-07 12:06:19 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
    2015-06-07 12:06:19 13255 [Note] Plugin 'FEDERATED' is disabled.
    2015-06-07 12:06:19 7fd6f83a67e0 InnoDB: Warning: Using innodb_additional_mem_pool_size is DEPRECATED. This option may be removed in future releases, together with the option innodb_use_sys_malloc and with the InnoDB's internal memory allocator.
    2015-06-07 12:06:19 13255 [Note] InnoDB: Using atomics to ref count buffer pool pages
    2015-06-07 12:06:19 13255 [Note] InnoDB: The InnoDB memory heap is disabled
    2015-06-07 12:06:19 13255 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
    2015-06-07 12:06:19 13255 [Note] InnoDB: Memory barrier is not used
    2015-06-07 12:06:19 13255 [Note] InnoDB: Compressed tables use zlib 1.2.3
    2015-06-07 12:06:19 13255 [Note] InnoDB: Using Linux native AIO
    2015-06-07 12:06:19 13255 [Note] InnoDB: Using CPU crc32 instructions
    2015-06-07 12:06:19 13255 [Note] InnoDB: Initializing buffer pool, size = 2.0G
    2015-06-07 12:06:19 13255 [Note] InnoDB: Completed initialization of buffer pool
    2015-06-07 12:06:19 13255 [Note] InnoDB: Highest supported file format is Barracuda.
    2015-06-07 12:06:19 13255 [Note] InnoDB: Log scan progressed past the checkpoint lsn 3505377488
    2015-06-07 12:06:19 13255 [Note] InnoDB: Database was not shutdown normally!
    2015-06-07 12:06:19 13255 [Note] InnoDB: Starting crash recovery.
    2015-06-07 12:06:19 13255 [Note] InnoDB: Reading tablespace information from the .ibd files...
    2015-06-07 12:06:20 13255 [Note] InnoDB: Restoring possible half-written data pages 
    2015-06-07 12:06:20 13255 [Note] InnoDB: from the doublewrite buffer...
    InnoDB: Doing recovery: scanned up to log sequence number 3510620160
    InnoDB: Doing recovery: scanned up to log sequence number 3515863040
    InnoDB: Doing recovery: scanned up to log sequence number 3521105920
    InnoDB: Doing recovery: scanned up to log sequence number 3526348800
    InnoDB: Doing recovery: scanned up to log sequence number 3531591680
    InnoDB: Doing recovery: scanned up to log sequence number 3536834560
    InnoDB: Doing recovery: scanned up to log sequence number 3542077440
    InnoDB: Doing recovery: scanned up to log sequence number 3547320320
    InnoDB: Doing recovery: scanned up to log sequence number 3552563200
    InnoDB: Doing recovery: scanned up to log sequence number 3557806080
    InnoDB: Doing recovery: scanned up to log sequence number 3563048960
    InnoDB: Doing recovery: scanned up to log sequence number 3568291840
    InnoDB: Doing recovery: scanned up to log sequence number 3573534720
    InnoDB: Doing recovery: scanned up to log sequence number 3578777600
    InnoDB: Doing recovery: scanned up to log sequence number 3584020480
    InnoDB: Doing recovery: scanned up to log sequence number 3589263360
    InnoDB: Doing recovery: scanned up to log sequence number 3594506240
    InnoDB: Doing recovery: scanned up to log sequence number 3599749120
    InnoDB: Doing recovery: scanned up to log sequence number 3604992000
    InnoDB: Doing recovery: scanned up to log sequence number 3610234880
    InnoDB: Doing recovery: scanned up to log sequence number 3615477760
    InnoDB: Doing recovery: scanned up to log sequence number 3620720640
    InnoDB: Doing recovery: scanned up to log sequence number 3625963520
    InnoDB: Doing recovery: scanned up to log sequence number 3631206400
    InnoDB: Doing recovery: scanned up to log sequence number 3636449280
    InnoDB: Doing recovery: scanned up to log sequence number 3641692160
    InnoDB: Doing recovery: scanned up to log sequence number 3646935040
    InnoDB: Doing recovery: scanned up to log sequence number 3652177920
    InnoDB: Doing recovery: scanned up to log sequence number 3657420800
    InnoDB: Doing recovery: scanned up to log sequence number 3662227637
    InnoDB: Transaction 743374 was in the XA prepared state.
    InnoDB: Transaction 743374 was in the XA prepared state.
    InnoDB: 2 transaction(s) which must be rolled back or cleaned up
    InnoDB: in total 1 row operations to undo
    InnoDB: Trx id counter is 743936
    2015-06-07 12:06:24 13255 [Note] InnoDB: Starting an apply batch of log records to the database...
    InnoDB: Progress in percent: 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 
    InnoDB: Apply batch completed
    InnoDB: Last MySQL binlog file position 0 171705192, file name dg6-logbin.000011
    2015-06-07 12:06:43 13255 [Note] InnoDB: 128 rollback segment(s) are active.
    2015-06-07 12:06:43 13255 [Note] InnoDB: Waiting for purge to start
    InnoDB: Starting in background the rollback of uncommitted transactions
    2015-06-07 12:06:43 7fd635de8700  InnoDB: Rolling back trx with id 743385, 1 rows to undo
    2015-06-07 12:06:43 13255 [Note] InnoDB: Rollback of trx with id 743385 completed
    2015-06-07 12:06:43 7fd635de8700  InnoDB: Rollback of non-prepared transactions completed
    2015-06-07 12:06:43 13255 [Note] InnoDB:  Percona XtraDB (http://www.percona.com) 5.6.21-rel70.1 started; log sequence number 3662227637
    2015-06-07 12:06:43 13255 [Note] Recovering after a crash using dg6-logbin
    2015-06-07 12:06:45 13255 [Note] Starting crash recovery...
    2015-06-07 12:06:45 7fd6f83a67e0  InnoDB: Starting recovery for XA transactions...
    2015-06-07 12:06:45 7fd6f83a67e0  InnoDB: Transaction 743374 in prepared state after recovery
    2015-06-07 12:06:45 7fd6f83a67e0  InnoDB: Transaction contains changes to 2 rows
    2015-06-07 12:06:45 7fd6f83a67e0  InnoDB: 1 transactions in prepared state after recovery
    2015-06-07 12:06:45 13255 [Note] Found 1 prepared transaction(s) in InnoDB
    2015-06-07 12:06:45 13255 [Note] Crash recovery finished.
    /opt/app/mysql/bin/mysqld: Found a Gtid_log_event or Previous_gtids_log_event when @@GLOBAL.GTID_MODE = OFF.
    /opt/app/mysql/bin/mysqld: Found a Gtid_log_event or Previous_gtids_log_event when @@GLOBAL.GTID_MODE = OFF.
    2015-06-07 12:06:45 13255 [Note] RSA private key file not found: /data/mydata//private_key.pem. Some authentication plugins will not work.
    2015-06-07 12:06:45 13255 [Note] RSA public key file not found: /data/mydata//public_key.pem. Some authentication plugins will not work.
    2015-06-07 12:06:45 13255 [Note] Server hostname (bind-address): '*'; port: 3306
    2015-06-07 12:06:45 13255 [Note] IPv6 is available.
    2015-06-07 12:06:45 13255 [Note]   - '::' resolves to '::';
    2015-06-07 12:06:45 13255 [Note] Server socket created on IP: '::'.
    2015-06-07 12:06:45 13255 [Warning] 'user' entry 'root@dg1' ignored in --skip-name-resolve mode.
    2015-06-07 12:06:45 13255 [Warning] 'proxies_priv' entry '@ root@dg1' ignored in --skip-name-resolve mode.
    2015-06-07 12:06:45 13255 [Note] Event Scheduler: Loaded 0 events
    2015-06-07 12:06:45 13255 [Note] /opt/app/mysql/bin/mysqld: ready for connections.
    Version: '5.6.21-70.1-log'  socket: '/tmp/mysql.sock'  port: 3306  Percona Server (GPL), Release 70.1, Revision 698

    也才二十几秒钟。

    那么我们看看5.5版本是什么情况 因为5.5版本redolog大小不能超过4G,所以单个不能设置成2048M否则会报错

    150607 17:15:46 InnoDB: Error: combined size of log files must be < 4 GB
    150607 17:15:46 [ERROR] Plugin 'InnoDB' init function returned error.

    2.4 innodb_log_file_size = 1024M

    150607 17:08:34 mysqld_safe Starting mysqld daemon with databases from /data/mydata
    150607 17:08:34 [Warning] 'THREAD_CONCURRENCY' is deprecated and will be removed in a future release.
    150607 17:08:34 [Note] /opt/app/mysql/bin/mysqld (mysqld 5.5.43-log) starting as process 3709 ...
    150607 17:08:34 [Note] Plugin 'FEDERATED' is disabled.
    150607 17:08:34 InnoDB: The InnoDB memory heap is disabled
    150607 17:08:34 InnoDB: Mutexes and rw_locks use GCC atomic builtins
    150607 17:08:34 InnoDB: Compressed tables use zlib 1.2.3
    150607 17:08:34 InnoDB: Using Linux native AIO
    150607 17:08:34 InnoDB: Initializing buffer pool, size = 2.0G
    150607 17:08:34 InnoDB: Completed initialization of buffer pool
    150607 17:08:34 InnoDB: highest supported file format is Barracuda.
    InnoDB: Log scan progressed past the checkpoint lsn 2740017318
    150607 17:08:34  InnoDB: Database was not shut down normally!
    InnoDB: Starting crash recovery.
    InnoDB: Reading tablespace information from the .ibd files...
    InnoDB: Restoring possible half-written data pages from the doublewrite
    InnoDB: buffer...
    InnoDB: Doing recovery: scanned up to log sequence number 2745260032
    InnoDB: Doing recovery: scanned up to log sequence number 2750502912
    InnoDB: Doing recovery: scanned up to log sequence number 2755745792
    InnoDB: Doing recovery: scanned up to log sequence number 2760988672
    InnoDB: Doing recovery: scanned up to log sequence number 2766231552
    InnoDB: Doing recovery: scanned up to log sequence number 2771474432
    InnoDB: Doing recovery: scanned up to log sequence number 2776717312
    InnoDB: Doing recovery: scanned up to log sequence number 2781960192
    InnoDB: Doing recovery: scanned up to log sequence number 2787203072
    InnoDB: Doing recovery: scanned up to log sequence number 2792445952
    InnoDB: Doing recovery: scanned up to log sequence number 2797688832
    InnoDB: Doing recovery: scanned up to log sequence number 2802931712
    InnoDB: Doing recovery: scanned up to log sequence number 2808174592
    InnoDB: Doing recovery: scanned up to log sequence number 2813417472
    InnoDB: Doing recovery: scanned up to log sequence number 2818660352
    InnoDB: Doing recovery: scanned up to log sequence number 2823903232
    InnoDB: Doing recovery: scanned up to log sequence number 2824243265
    InnoDB: Transaction 203E1 was in the XA prepared state.
    InnoDB: 1 transaction(s) which must be rolled back or cleaned up
    InnoDB: in total 0 row operations to undo
    InnoDB: Trx id counter is 20500
    150607 17:08:36  InnoDB: Starting an apply batch of log records to the database...
    InnoDB: Progress in percents: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 
    InnoDB: Apply batch completed
    InnoDB: Last MySQL binlog file position 0 923730775, file name ./mysql-bin.000005
    InnoDB: Starting in background the rollback of uncommitted transactions
    150607 17:08:45  InnoDB: Rollback of non-prepared transactions completed
    150607 17:08:45  InnoDB: Waiting for the background threads to start
    150607 17:08:46 InnoDB: 5.5.43 started; log sequence number 2824243265
    150607 17:08:46 [Note] Recovering after a crash using mysql-bin
    150607 17:08:54 [Note] Starting crash recovery...
    150607 17:08:54  InnoDB: Starting recovery for XA transactions...
    150607 17:08:54  InnoDB: Transaction 203E1 in prepared state after recovery
    150607 17:08:54  InnoDB: Transaction contains changes to 2 rows
    150607 17:08:54  InnoDB: 1 transactions in prepared state after recovery
    150607 17:08:54 [Note] Found 1 prepared transaction(s) in InnoDB
    150607 17:08:54 [Note] Crash recovery finished.
    150607 17:08:54 [Note] Server hostname (bind-address): '0.0.0.0'; port: 3306
    150607 17:08:54 [Note]   - '0.0.0.0' resolves to '0.0.0.0';
    150607 17:08:54 [Note] Server socket created on IP: '0.0.0.0'.
    150607 17:08:55 [Warning] 'user' entry 'root@dg1' ignored in --skip-name-resolve mode.
    150607 17:08:55 [Warning] 'user' entry '@dg1' ignored in --skip-name-resolve mode.
    150607 17:08:55 [Warning] 'proxies_priv' entry '@ root@dg1' ignored in --skip-name-resolve mode.
    150607 17:08:55 [Note] Event Scheduler: Loaded 0 events
    150607 17:08:55 [Note] /opt/app/mysql/bin/mysqld: ready for connections.
    Version: '5.5.43-log'  socket: '/tmp/mysql.sock'  port: 3306  MySQL Community Server (GPL)

    也不会很慢二十几秒钟

     总结:

    在5.5版本以上,修改了恢复算法,崩溃恢复快了很多,但是这里面涉及到很多因素,buffer_pool ,脏页比例,TPS等,需要多次测试,因条件限制,没办法进行大buffer_pool,高并发测试,实际物理机测试时,根据自身情况选着合理参数测试

    参考资料:来自姜大神的书

    在InnoDB存储引擎内部,有两种Checkpoint,分别为:

    Sharp Checkpoint

    Fuzzy Checkpoint

    Sharp Checkpoint发生在数据库关闭时将所有的脏页都刷新回磁盘,这是默认的工作方式,即参数innodb_fast_shutdown=1。

    但是若数据库在运行时也使用Sharp Checkpoint,那么数据库的可用性就会受到很大的影响。故在InnoDB存储引擎内部使用Fuzzy Checkpoint进行页的刷新,即只刷新一部分脏页,而不是刷新所有的脏页回磁盘。

    这里笔者进行了概括,在InnoDB存储引擎中可能发生如下几种情况的Fuzzy Checkpoint:

    Master Thread Checkpoint

    FLUSH_LRU_LIST Checkpoint

    Async/Sync Flush Checkpoint

    Dirty Page too much Checkpoint

    对于Master Thread(2.5节会详细介绍各个版本中Master Thread的实现)中发生的Checkpoint,差不多以每秒或每十秒的速度从缓冲池的脏页列表中刷新一定比例的页回磁盘。这个过程是异步的,即此时InnoDB存储引擎可以进行其他的操作,用户查询线程不会阻塞。

    FLUSH_LRU_LIST Checkpoint是因为InnoDB存储引擎需要保证LRU列表中需要有差不多100个空闲页可供使用。在InnoDB1.1.x版本之前,需要检查LRU列表中是否有足够的可用空间操作发生在用户查询线程中,显然这会阻塞用户的查询操作。倘若没有100个可用空闲页,那么InnoDB存储引擎会将LRU列表尾端的页移除。如果这些页中有脏页,那么需要进行Checkpoint,而这些页是来自LRU列表的,因此称为FLUSH_LRU_LIST Checkpoint。

    而从MySQL 5.6版本,也就是InnoDB1.2.x版本开始,这个检查被放在了一个单独的Page Cleaner线程中进行,并且用户可以通过参数innodb_lru_scan_depth控制LRU列表中可用页的数量,该值默认为1024,如:

    mysql> SHOW VARIABLES LIKE 'innodb_lru_scan_depth'G;

    *************************** 1. row ***************************

    Variable_name: innodb_lru_scan_depth

           Value: 1024

    1 row in set (0.00 sec)

    Async/Sync Flush Checkpoint指的是重做日志文件不可用的情况,这时需要强制将一些页刷新回磁盘,而此时脏页是从脏页列表中选取的。若将已经写入到重做日志的LSN记为redo_lsn,将已经刷新回磁盘最新页的LSN记为checkpoint_lsn,则可定义:

    checkpoint_age = redo_lsn - checkpoint_lsn

    再定义以下的变量:

    async_water_mark = 75% * total_redo_log_file_size

    sync_water_mark = 90% * total_redo_log_file_size

    若每个重做日志文件的大小为1GB,并且定义了两个重做日志文件,则重做日志文件的总大小为2GB。那么async_water_mark=1.5GB,sync_water_mark=1.8GB。则:

    当checkpoint_age<async_water_mark时,不需要刷新任何脏页到磁盘;

    当async_water_mark<checkpoint_age<sync_water_mark时触发Async Flush,从Flush列表中刷新足够的脏页回磁盘,使得刷新后满足checkpoint_age<async_water_mark;

    checkpoint_age>sync_water_mark这种情况一般很少发生,除非设置的重做日志文件太小,并且在进行类似LOAD DATA的BULK INSERT操作。此时触发Sync Flush操作,从Flush列表中刷新足够的脏页回磁盘,使得刷新后满足checkpoint_age<async_water_mark。

    可见,Async/Sync Flush Checkpoint是为了保证重做日志的循环使用的可用性。在InnoDB 1.2.x版本之前,Async Flush Checkpoint会阻塞发现问题的用户查询线程,而Sync Flush Checkpoint会阻塞所有的用户查询线程,并且等待脏页刷新完成。从InnoDB 1.2.x版本开始——也就是MySQL 5.6版本,这部分的刷新操作同样放入到了单独的Page Cleaner Thread中,故不会阻塞用户查询线程。

    MySQL官方版本并不能查看刷新页是从Flush列表中还是从LRU列表中进行Checkpoint的,也不知道因为重做日志而产生的Async/Sync Flush的次数。但是InnoSQL版本提供了方法,可以通过命令SHOW ENGINE INNODB STATUS来观察,如:

    mysql> SHOW ENGINE INNODB STATUSG;

    *************************** 1. row ***************************

      Type: InnoDB

    ……

    LRU len: 112902, unzip_LRU len: 0

    I/O sum[0]:cur[0], unzip sum[0]:cur[0]

    Async Flush: 0, Sync Flush: 0, LRU List Flush: 0, Flush List Flush: 111736

    ……

    1 row in set (0.01 sec)

    根据上述的信息,还可以对InnoDB存储引擎做更为深入的调优,这部分将在第9章中讲述。

    最后一种Checkpoint的情况是Dirty Page too much,即脏页的数量太多,导致InnoDB存储引擎强制进行Checkpoint。其目的总的来说还是为了保证缓冲池中有足够可用的页。其可由参数innodb_max_dirty_pages_pct控制:

    mysql>SHOW VARIABLES LIKE 'innodb_max_dirty_pages_pct'G;

    *************************** 1. row ***************************

    Variable_name: innodb_max_dirty_pages_pct

           Value: 75

    1 row in set (0.00 sec)

    innodb_max_dirty_pages_pct值为75表示,当缓冲池中脏页的数量占据75%时,强制进行Checkpoint,刷新一部分的脏页到磁盘。在InnoDB 1.0.x版本之前,该参数默认值为90,之后的版本都为75。

  • 相关阅读:
    简单工厂设计模式-模拟磁盘打开文件
    使用GDI绘制验证码
    nginx笔记.
    git 笔记
    ubuntu错误解决。
    测试那些事儿—简述CPU的工作原理
    田螺便利店—win10专业版激活码
    田螺便利店—PyCharm安装第三方库
    田螺便利店—命令提示符总是提示不是内部外部命令
    田螺便利店—ipconfig命令不是内部命令或外部命令怎么解决?
  • 原文地址:https://www.cnblogs.com/LMySQL/p/4558155.html
Copyright © 2011-2022 走看看