簡介:mysql
數據庫的東西,每每一個參數就牽涉N多知識點。因此簡單的說一下。你們都知道是支持事務的存儲引擎。事務的四個特性ACID即原子性(),一致性(),隔離性(),持久性()。其中原子性,一致性,持久性經過redo log 和 undo來實現。redo log稱為重作日志,用來保證事務的原子性和持久性。undo log用來保證事務的一致性。當事務提交時,必須先將該事務的全部日志寫入到重作日志文件(redo log)進行持久化(固然先寫到日志緩沖區,而不是直接寫文件,關于何時刷新到磁盤文件,是一個比較復雜的問題,同窗們自行查閱資料),待事務提交操做才算完成。的redo log是順序I/O,因此設置合適的值可以大大提升數據庫性能。那么是否是設置的越大越好呢?sql
設置的過小:當一個日志文件寫滿后,會自動切換到另一個日志文件,并且會觸發數據庫的檢查點()日志記錄緩沖區多大好日志記錄緩沖區多大好,這會致使緩存臟頁的小批量刷新,會明顯下降的性能。數據庫
設置的太大:設置很大之后減小了,而且因為redo log是順序I/O,大大提升了I/O性能。可是若是數據庫意外出現了問題,好比意外宕機,那么須要重放日志而且恢復已經提交的事務,若是日志很大,那么將會致使恢復時間很長。甚至到咱們不能接受的程度。緩存
那么咱們如何估算log file該設置為多大?一般咱們能夠經過觀察show 中n狀態變量來查看對日志文件寫出了多少數據。一個好用的經驗是,查看10-100秒間隔的數字,而后記錄峰值。能夠用這個判斷日志緩沖是否設置的正好。例如,若看到峰值是每秒寫100kb數據到日志,那么1MB的日志緩沖已經足夠了。也可使用這個衡量標準來決定日志文件設置多大會比較好。若是峰值是100KB/s,那么256M的日志文件足夠存儲至少2560秒的日志記錄。通常來講,日志文件的所有大小,應該足夠容納服務器一個小時的活動內容。服務器
下面看實際的測試(因為是虛擬機,因此使用模擬據量寫入,生產環境選擇數據庫最繁忙的時候測試):
[root@yayun-mysql-server ~]# sysbench --test=oltp --oltp-table-size=100000 --oltp-read-only=off --init-rng=on --num-threads=16 --max-requests=0 --oltp-dist-type=uniform --max-time=180 --mysql-user=root --mysql-socket=/tmp/mysqld.sock --mysql-password=123456 --db-driver=mysql --mysql-table-engine=innodb --oltp-test-mode=complex prepare
1.首先計算每分鐘產生的日志量:性能
(root@yayun-mysql-server) [(none)]>pager grep sequence PAGER set to 'grep sequence' (root@yayun-mysql-server) [(none)]>show engine innodb status\G select sleep(60); show engine innodb status\GLog sequence number 6377275259 1 row in set (0.00 sec) 1 row in set (1 min 0.00 sec) Log sequence number 6403945555 1 row in set (0.00 sec) (root@yayun-mysql-server) [(none)]>nopager PAGER set to stdout (root@yayun-mysql-server) [(none)]>select (6403945555 - 6377275259) / 1024 / 1024 as MB_per_min;
+-------------+ | MB_per_min | +-------------+ | 25.43477631 | +-------------+ 1 row in set (0.02 sec) (root@yayun-mysql-server) [(none)]>
注意Log ,這是寫入事務日志的總字節數。因此,如今你能夠看到每分鐘有多少MB日志寫入(這里的技術適用于全部版本的MySQL,在5.0及更高版本,你能夠從SHOW 的輸出看n的值)。測試
經過計算后獲得每分鐘有25M的日志寫入。atom
根據經驗法則。一般咱們設置redo log size足夠大,可以容納1個小時的日志寫入量。spa
1小時日志寫入量=25M * 60=1500M,大約等于1.5G。因為默認有兩個日志重作日志文件和。在日志組中的每一個重作日志文件的大小一致,并以循環的方式寫入。存儲引擎先寫重作日志文件0,當達到文件的最后時,會切換到重作日志1,并。以此循環。
因此咱們能夠大約設置=800M。注意:在.2.x版本以前,重作日志文件總的大小不得大于等于4G,而1.2.x版本將該限制擴大到了521G。
innodb_log_file_size = 800M
[root@yayun-mysql-server mysql]# du -sh ib_logfile* 801M ib_logfile0 801M ib_logfile1 [root@yayun-mysql-server mysql]#
對于 1.2.x版本以前若是設置大于4G則報錯
[root@yayun-mysql-server mysql]# tail -n 10 yayun-mysql-server.err 140511 1:01:15 InnoDB: Completed initialization of buffer pool 140511 1:01:15 InnoDB: Error: combined size of log files must be < 4 GB140511 1:01:15 [ERROR] Plugin 'InnoDB' init function returned error. 140511 1:01:15 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed. 140511 1:01:15 [ERROR] Failed to initialize plugins. 140511 1:01:15 [ERROR] Aborting 140511 1:01:15 [Note] /usr/local/mysql/bin/mysqld: Shutdown complete 140511 01:01:15 mysqld_safe mysqld from pid file /data/mysql/yayun-mysql-server.pid ended [root@yayun-mysql-server mysql]#
而 1.2.x之后版本則不會:
[root@yayun-mysql-server mysql5.6]# tail -f yayun-mysql-server.err2014-05-11 01:06:47 5205 [Note] InnoDB: Using Linux native AIO 2014-05-11 01:06:47 5205 [Note] InnoDB: Initializing buffer pool, size = 128.0M 2014-05-11 01:06:47 5205 [Note] InnoDB: Completed initialization of buffer pool 2014-05-11 01:06:47 5205 [Note] InnoDB: Highest supported file format is Barracuda. 2014-05-11 01:06:47 5205 [Warning] InnoDB: Resizing redo log from 2*3072 to 2*327680 pages, LSN=1085681253 2014-05-11 01:06:47 5205 [Warning] InnoDB: Starting to delete and rewrite log files. 2014-05-11 01:06:47 5205 [Note] InnoDB: Setting log file ./ib_logfile101 size to 5120 MB InnoDB: Progress in MB: 100 200 300 400 500 600 700 800 900 1000 1100 1200 1300 1400 1500 1600 1700 1800 1900 2000 2100 2200 2300 2400 2500 2600 2700 2800 2900 3000 3100 3200 3300 3400 3500 3600 3700 3800 3900 4000 4100 4200 4300 4400 4500 4600 4700 4800 4900 5000 5100 2014-05-11 01:12:40 5205 [Note] InnoDB: Setting log file ./ib_logfile1 size to 5120 MB InnoDB: Progress in MB: 100 200 300 400 500 600 700 800 900 1000 1100 1200 1300 1400 1500 1600 1700 1800 1900 2000 2100 2200 2300 2400 2500 2600 2700 2800 2900 3000 3100
參考資料