[root@mobanji logs]# vim /etc/my.cnf mysql
[mysqld_safe]sql
log-error = /application/mysql/logs/cc666.err數據庫
顯示以下:vim
[root@mobanji ~]# mysqld_safe --log-error=/application/mysql-5.6.34/data/cc666.err &緩存
[1] 13188bash
mysql> show variables like 'log_error%';服務器
+---------------+------------------------------------+session
| Variable_name | Value |併發
+---------------+------------------------------------+app
| log_error | /application/mysql/logs/cc666.err |
+---------------+------------------------------------+
1 row in set (0.00 sec)
mysql>
管理員可使用命令輪詢錯誤日誌,例如能夠按天輪詢,具體方法以下:
[root@mobanji ~]# cd /application/mysql/data/ #切換到日誌目錄下
[root@mobanji data]# mv cc666.err cc666_$(date +%F).err #將錯誤日誌按天移動更名
[root@mobanji data]# mysqladmin flush-logs #執行刷新日誌命令
[root@mobanji data]# mysqladmin -uroot -p123 flush-logs
Warning: Using a password on the command line interface can be insecure.
[root@mobanji data]# ls -l old
cc666/ cc666_2017-05-04.err oldgirl/
[root@mobanji data]# ls -l cc666_2017-05-04.err #新的錯誤日誌誕生了
-rw-r----- 1 mysql root 60 May 4 21:41 cc666_2017-05-04.err
[root@mobanji data]# cat cc666_2017-05-04.err
170504 21:41:02 mysqld_safe A mysqld process already exists
[root@mobanji data]#
新手安裝數據庫時,遇到數據庫沒法啓動時的排查方法爲:
1.先把錯誤日誌文件清空,而後從新啓動MySQL服務,再查看日誌文件報有什麼錯誤,並根據錯誤日誌進行處理。
2.若是沒法解決,則刪除數據文件,從新初始化數據庫。
假設在故障排查時,獲得的錯誤日誌提示爲:
InnoDB:The error means mysqld does not have the access rights to
Innodb:the directory
根據提示可知,是權限問題致使的問題,可對數據目錄遞歸執行權限,而後在重啓數據庫命令以下:
[root@mobanji data]# chown -R mysql.mysql /application/mysql/data/
[root@mobanji data]#
普通日誌查詢的做用是記錄客戶端鏈接信息,以及執行的SQL語句信息
可能官方考慮到普通查詢日誌的重要性比較低,所以默認狀況下普通查詢日誌是關閉狀態,以下所示:
[mysqld] #寫在[mysql]下
general_log = on
general_log_file = /application/mysql-5.6.34/data/cc666.log
[root@mobanji data]# cat /application/mysql-5.6.34/data/cc666.log
/application/mysql/bin/mysqld, Version: 5.6.34-log (Source distribution). started with:
Tcp port: 0 Unix socket: (null)
Time Id Command Argument
mysql> set global general_log = on;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'general_log%';
+------------------+-------------------------------------------+
| Variable_name | Value |
+------------------+-------------------------------------------+
| general_log | ON |
| general_log_file | /application/mysql-5.6.34/data/cc666.log |
+------------------+-------------------------------------------+
2 rows in set (0.00 sec)
mysql>
mysql> system cat /application/mysql/data/db02.log
/application/mysql/bin/mysqld, Version: 5.6.34-log (Source distribution). started with:
Tcp port: 3306 Unix socket: /application/mysql-5.6.34/tmp/mysql.sock
Time Id Command Argument
170504 10:34:57 6 Query show variables like 'general_log%'
170504 10:35:51 6 Query select * from mysql.user
170504 10:36:02 6 Query show databases
訪問量不大的企業沒有審計需求的不用開啓。互聯網公司要關閉普通日誌,減少磁盤IO讀寫負載
在高併發數據庫的場景,普通查詢日誌應該是關閉的(默認也是關閉),主要是由於查詢日誌信息量會很大,容易致使磁盤I/O性能問題,當訪問量不是很大,而企業又有審計執行的SQL語句需求時,能夠考慮開啓該功能。
二進制日誌(binary log)的做用是記錄數據庫裏的數據被修改的SQL語句,通常爲DDL和DML語句,例如含有insert update delete create drop alter等關鍵字的語句
二進制日誌最重要的做用有2個:
第一個記錄MySQL數據的增量數據,用來作增量數據庫恢復,沒有二進制功能,MySQL的備份將沒法完整還原數據
第二個是實現主從複製功能,具體可見MySQL主從複製相關內容
前文已經講過了,查驗二進制文件內容以下所示
[root@mobanji data]# grep log_bin /etc/my.cnf
# log_bin
log_bin = /application/mysql/logs/cc666-bin
[root@mobanji data]#
mysql> system mysqlbinlog cc666-bin.00005|grep "cc666"
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |#記錄binlog開關
+---------------+-------+
1 row in set (0.00 sec)
mysql> show variables like '%log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON | #記錄binlog開關
| sql_log_bin | ON | #臨時不記錄binlog開關
+---------------+-------+
2 rows in set (0.00 sec)
mysql>
mysql> system mysqlbinlog cc666-bin.000013|grep 'cc666'; # 過濾binlog文件 沒有
mysql>
mysql> drop database cc666;
Query OK, 1 row affected (0.23 sec)
mysql> system mysqlbinlog cc666-bin.000013|grep 'cc666'; #繼續過濾發現記錄了binlog
drop database cc666
mysql>
Sql_log_bin的功能就是用戶一般用於mysql數據恢復時,不但願恢復的數據SQL記錄到binlog裏面的狀況。
有個參數能夠實如今開啓binlog功能的前提下,臨時不記錄binlog,實例以下:
mysql> set session sql_log_bin = OFF;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like '%log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
| sql_log_bin | OFF | #已經關閉
+---------------+-------+
2 rows in set (0.00 sec)
mysql> show variables like '%log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
| sql_log_bin | OFF |
+---------------+-------+
2 rows in set (0.00 sec)
mysql> create database cc666;
Query OK, 1 row affected (0.00 sec)
mysql> system mysqlbinlog cc666-bin.000013|grep 'cc666';
drop database cc666
mysql> system mysqlbinlog cc666-bin.000013|grep 'cc666';
drop database cc666
mysql>
數據庫重啓會自動刷新binlog爲新文件
執行mysqldump -F 或mysqladmin flush-logs 會將binlog刷新爲新文件
Binlog文件達到1GB左右時,會自動刷新binlog爲新文件
人爲配置切割及調整
Binlog 最大值控制參數及默認大小查看方法以下:
mysql> show variables like 'max_binlog_size';
+-----------------+------------+
| Variable_name | Value |
+-----------------+------------+
| max_binlog_size | 1073741824 |
+-----------------+------------+
1 row in set (0.00 sec)
除了不少按序生成的binlog文件列表外,還有一個索引文件,例以下文裏的cc666-bin.index
[root@mobanji data]# cd /application/mysql/logs/
[root@mobanji logs]# ls
bin.sql cc666-bin.000008 cc666-bin.000011 cc666-bin.index
cc666-bin.000006 cc666-bin.000009 cc666-bin.000012 cc666.err
cc666-bin.000007 cc666-bin.000010 cc666-bin.000013 slow.log
索引文件的文件名和binlog文件同樣,只是擴展名爲index,查看索引文件內容的命令以下:
mysql> show variables like 'log_bin_index';
+---------------+------------------------------------------+
| Variable_name | Value |
+---------------+------------------------------------------+
| log_bin_index | /application/mysql/logs/cc666-bin.index |
+---------------+------------------------------------------+
1 row in set (0.00 sec)
mysql>
Binlog日誌很重要,不能隨意清除,有些讀者看到所維護的服務器空間滿了,居然會直接刪除binlog物理文件,這樣的操做是錯誤的,應避免,那麼如何正確刪除binlog文件呢?
首先1,要肯定何時能夠刪除binlog
理論上天天的數據庫全備時刻之前的binlog都是無用的,可是工做中咱們會根據須要保留3-7天的本地binlog的文件。
設置參數自動刪除binlog是每一個管理員都應該作的,參數設置例以下
假設參數爲
Expire_logs_days=7 #刪除七天之前的日誌
該參數默認是沒有配置的,生產中能夠實如今線修改永久配置文件
mysql> show variables like 'expire_logs-days';
mysql> show binary logs;
+-------------------+-----------+
| Log_name | File_size |
+-------------------+-----------+
| cc666-bin.000006 | 143 |
| cc666-bin.000007 | 1487 |
| cc666-bin.000008 | 4033 |
| cc666-bin.000009 | 576 |
| cc666-bin.000010 | 246 |
| cc666-bin.000011 | 168 |
| cc666-bin.000012 | 143 |
| cc666-bin.000013 | 218 |
+-------------------+-----------+
8 rows in set (0.00 sec)
刪除標識位置以後的
mysql> purge binary logs to 'cc666-bin.000006';
Query OK, 0 rows affected (0.01 sec)
mysql> system ls -l --time-style=long-iso cc666-bin*;
-rw-rw---- 1 mysql mysql 143 2017-05-03 15:53 cc666-bin.000006
-rw-rw---- 1 mysql mysql 1487 2017-05-03 17:43 cc666-bin.000007
-rw-rw---- 1 mysql mysql 4033 2017-05-03 17:59 cc666-bin.000008
-rw-rw---- 1 mysql mysql 576 2017-04-25 08:53 cc666-bin.000009
-rw-rw---- 1 mysql mysql 246 2017-05-04 18:06 cc666-bin.000010
-rw-rw---- 1 mysql mysql 168 2017-05-04 21:55 cc666-bin.000011
-rw-rw---- 1 mysql mysql 143 2017-05-04 22:32 cc666-bin.000012
-rw-rw---- 1 mysql mysql 218 2017-05-05 12:12 cc666-bin.000013
-rw-rw---- 1 mysql mysql 336 2017-05-04 22:32 cc666-bin.index
mysql>
mysql> PURGE MASTER LOGS BEFORE '2017-05-02 19:53';
Query OK, 0 rows affected (0.01 sec)
二進制日誌緩存是數據庫爲每個客戶鏈接分配的內存空間,對於事務引擎來講,適當調整該參數會得到更好的性能,該參數的默認值爲:
該參數用於設置binlog日誌的最大大小,默認爲1GB,但該值並不能很嚴格控制binlog大小,若binlog大小接近1GB,而此時又執行了一個較大事務,爲了保證事務的完整性,數據庫不會作日誌刷新動做,而是直到該事務的日誌所有記錄進入當前binlog日誌後纔會進行刷新,該參數的默認值查詢結果爲
mysql> show variables like '%max_binlog_size%';
+-----------------+------------+
| Variable_name | Value |
+-----------------+------------+
| max_binlog_size | 1073741824 |
+-----------------+------------+
1 row in set (0.00 sec)
mysql>
這個參數的做用是控制binlog何時同步到磁盤。對數據來講,這是很重要的參數,它不只能夠影響數據庫的性能,還會影響數據庫的完整性
Sync_binlog=0 表示在事務提交以後,數據庫不會將binlog_cache 中的數據刷到磁盤,而是讓文件系統自行決定何時來作刷新或者緩存滿以後才刷新到磁盤
Sync_binlog=n 表示每進行n次事務提交以後,數據庫將進行一次緩存數據強制刷新到磁盤的操做。
該參數默認的設置是0,示例以下:
mysql> show variables like '%sync_binlog%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog | 0 |
+---------------+-------+
1 row in set (0.14 sec)
mysql>
MySQL使用不一樣的模式記錄二進制日誌信息,最多見的有三種模式
語句模式是MySQL5.6版本模式,簡單地說,就是每一條被修改的數據的SQL語句都會記錄到master的binlog中,在複製slave庫的時候,SQL進程會解析成和原來master端執行過的SQL來再次執行。
該模式的優勢是不須要記錄細到master的binlog中。在複製slave庫的時候,SQL進程會解析成和原來master端執行過的相同的SQL來再次執行
該模式的優勢是不須要記錄到每一行數據的更改變化,所以,可減小binlog日誌量,要少不少,節約磁盤I/O,提升系統性能。
但該模式一樣有一些缺點,因爲語句模式記錄的是執行的SQL語句,因此,對於某些具備特殊功能的SQL語句,就可能致使沒法再從庫上正確執行,從而致使主從庫數據不一致。
例如:當特殊的函數被執行時,當觸發器,存儲過程等特殊功能被執行時,而row level模式是基於每一行來記錄變化的,因此不會出現相似的問題。
簡單地說,行級模式就是將數據被修改的每一行的狀況記錄爲一條語句。
優勢:在行級模式下,binlog中科院不記錄執行的SQL語句的上下文相關信息,僅僅記錄了哪一條被修改了,修改爲什麼樣了,因此row level的日誌內容會很是清楚地記錄下每一行數據修改的細節,很是容易理解。並且不會出現某些特定狀況下的存儲過程或function以及trigger的調用和觸發沒法被正確複製的內容。
缺點:行級模式下,全部的執行語句都將根據修改的行來記錄,而這就可能會產生大量的日誌內容,例如一條語句修改了100萬行,語句模式就用一條語句便可搞定,而行級模式執行後,日誌中記錄的就是100萬行,語句模式就用一條語句便可搞定,而行級模式以後,日誌中記錄的就是100萬行的修改記錄,binlog量可能會大的驚人。
混合模式默認採用語句模式記錄日誌,會在一些特定狀況下會記錄模式切換爲行級模式記錄,這些特殊狀況包含不限於有:
當函數中包含UUID()時
當表中有自增列被更新時
當觸發器或者等特殊功能時
當FOUND_ROWS(),ROW_COUNT(),USER()CURRENT_USER()CURRENT_USER等執行時
臨時調整命令以下:
mysql>SET GLOBAL binlog_format=’STATEMENT’;
>SET GLOBAL binlog_format=’ROW’
>SET GLOBAL binlog_format=’MIXED’
永久調整能夠直接將‘binlog_format=’模式名’’寫入到my.cnf配置文件中並重啓服務。
簡單地理解,慢查詢日誌就是記錄執行時間超出指定值或其它條件的SQL語句
慢查詢的參數對於數據庫SQL的優化很是重要,是SQL優化前提,所以,這裏以表的形式說明。
Slow-query-log=ON #慢查詢開啓開關
Long_query_time =2 #記錄大於2秒的SQL語句
Log_queries_not_using_indexes =ON #沒有使用索引的SQL語句
Slow-query-log-file = /application/mysql/slow.log #記錄SQL語句的文件
Min_examinde_row_limit=800 #記錄結果集大於800行的SQL語句
在工做中,能夠利用定時任務按天對慢查詢日誌進行切割,而後再分析。
示例切割腳本爲:
[root@cc666 data]# mkdir /server/scripts/ -p
[root@cc666 data]# cat /server/scripts/cut_slow_log.sh
#!/bin/bash
# Author: cc666
# Organization: www.cc666edu.com
# Created Time : 2017-03-19 23:47:21
export PATH=/application/mysql/bin:/sbin:/bin:/usr/sbin:/usr/bin
cd /application/mysql &&\
mv slow.log slow.log.$(date +%F)&&\
mysqladmin flush-log
實際工做中,慢查詢的日誌可能很是多,給優化的運維人員帶來了必定的困難,MySQL官方提供了慢查詢的分析工具mysqldumpslow,有興趣的讀者能夠參考官方的4.6.9節「mysqldumpslow」瞭解該工具的用法
1.安裝mysqlsla
請提早下載好mysqlsla-2.03.tar.gz到指定目錄下,而後執行以下命令安裝。
yum install perl-devel perl-DBI perl-DBD-MySQL -y
rpm -qa perl-devel perl-DBI perl-DBD-MySQL
tar xf mysqlsla-2.03.tar.gz
cd mysqlsla-2.03
perl Makefile.PL
make
make install
2.利用mysqlsla工具分析慢查詢
Mysqlsla命令默認路徑爲:/usr/local/bin/mysqlsla
3.安裝mysqlsla
3.mysqlsla安裝
yum install perl-devel perl-DBI perl-DBD-MySQL -y
rpm -qa perl-devel perl-DBI perl-DBD-MySQL
wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz
tar xf mysqlsla-2.03.tar.gz
cd mysqlsla-2.03
perl Makefile.PL
make
make install
mysqlsla命令默認路徑爲:
[root@cc666 mysqlsla-2.03]# which mysqlsla
/usr/local/bin/mysqlsla