-----------------------------日誌-----------------------------------mysql
MySQL的日誌類型有如下幾種:sql
1. 錯誤日誌(error),MySQL服務實例啓動、運行或者中止等相關信息。 2. 普通查詢日誌(general),MySQL服務實例運行的全部SQL語句或者MySQL命令。 3. 二進制日誌(binary),對數據庫執行的全部更新語句,不包括select 和show語句。 4. 慢查詢日誌(slow),執行時間超過long_query_time 設置值的SQL語句,或者沒有使用索引的SQL語句。
默認狀況下,全部的MySQL日誌以文件的方式存放在數據庫根目錄下:數據庫
[root@localhost data]# pwd/usr/local/mysql/data [root@localhost data]# ls auto.cnf ibdata1 ib_logfile1 mysql sys ib_buffer_pool ib_logfile0 ibtmp1 performance_schema
這裏主要講到兩種日誌 vim
1. 錯誤日誌 安全
錯誤日誌記錄着mysqld啓動和中止,以及服務器在運行過程當中發生的錯誤的相關信息。在默認狀況下,系統記錄錯誤日誌的功能是關閉的,錯誤信息被輸出到標準錯誤輸出。須要在啓動的時候開啓 log-error選項服務器
若是沒有指定文件名 默認hostname.err,默認路徑爲datadir目錄session
開啓錯誤日誌的操做:app
[root@localhost data]# vim /etc/my.cnf //編輯配置文件 在[mysqld]下添加:log-error=/usr/local/mysql/data/mysql_error.log [root@localhost data]# systemctl restart mysqld.service //重啓服務 [root@localhost data]# ls //查看文件是否產生日誌文件 auto.cnf ibdata1 ib_logfile1 mysql performance_schema ib_buffer_pool ib_logfile0 ibtmp1 mysql_error.log sys mysql> show variables like '%err%'; //查看錯誤日誌狀態 +---------------------+---------------------------------------+ | Variable_name | Value | +---------------------+---------------------------------------+ | binlog_error_action | ABORT_SERVER | | error_count | 0 | | log_error | /usr/local/mysql/data/mysql_error.log | | log_error_verbosity | 3 | | max_connect_errors | 100 | | max_error_count | 64 | | slave_skip_errors | OFF | +---------------------+---------------------------------------+ 7 rows in set (0.01 sec)
錯誤日誌的清理: [root@localhost data]# ls auto.cnf ibdata1 ib_logfile1 mysql performance_schema ib_buffer_pool ib_logfile0 ibtmp1 mysql_error.log sys[root@localhost data]# mv mysql_error.log mysql_olderror.log[root@localhost data]# mysqladmin -uroot -pabc123 flush-logs mysqladmin: [Warning] Using a password on the command line interface can be insecure.
2.二進制日誌(重點!) ide
二進制日誌不會記錄select ,show 等不修改數據的語句。打開二進制日誌會消耗一些系統系能,可是對於複製和系統恢復,所帶來的好處大於減小的性能,它用來實現複製的基本憑據。也就是說,你能夠將生成環境中的MySQL的二進制文件拿到線下的服務器上運行一下,理論上你會拿到和生成環境中同樣的數據,所以,二進制日誌也叫複製日誌。二進制日誌文件默認在數據目錄下,一般狀況下爲mysql-bin#(例如:mysql-bin.000001,mysql-bin000002)。二進制日誌即binlog日誌 記錄數據定義語言(DDL)和數據控制語言(DML) 但不包括數據查詢語言。性能
二進制日誌的主要功能
一、恢復(recovery)
二、複製(replication)
二進制日誌文件內容格式
1.事件發生的日期和時間(會在關鍵字「at」)
2.服務器ID(server id)
3.事件結束位置(end_log_pos)
4.事件的類型(如:Query,Stop等等)
5.原服務器生成此事件時的線程ID號(thead_id,能夠經過「show processlist;」進行查詢)
6.語句時間戳和寫入二進制文件的時間差,單位爲秒(exec_time,表示記錄日誌所用的時間戳,當他等於0時表示沒有用到1秒鐘。)
7.錯誤代碼,0表示正常執行(error_code,排查方法就得查看官方文檔。)
8.事件內容(修改的SQL語句)
9.事件位置(至關於下一事件的開始位置,仍是用「at」關鍵字標誌)
開啓二進制日誌
[root@localhost data]# vim /etc/my.cnf //編輯配置文件 再[mysqld]下添加: log_bin=mysql-bin [root@localhost data]# systemctl restart mysqld.service //重啓服務
二進制日誌狀態查看
系統變量log_bin的值爲OFF表示沒有開啓二進制日誌(binary log)。ON表示開啓了二進制日誌(binary log)
mysql> show variables like 'log_bin'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_bin | ON | +---------------+-------+ 1 row in set (0.00 sec)
查看當前服務器全部的二進制日誌文件
mysql> show binary logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 154 | +------------------+-----------+ 1 row in set (0.00 sec)
查看當前二進制日誌文件狀態
mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 154 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
爲了不一個文件過大,咱們能夠適當的將文件的內容分開存儲,這就是日誌滾動,好比:當超過1G,日誌會滾動。固然,你也能夠按照文件大小自定義, 時間定義。想要手動滾動日誌,執行「flush logs;」便可。
mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 154 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) mysql> flush logs; Query OK, 0 rows affected (0.01 sec) mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000002 | 154 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
查看第一個binlog文件的內容
mysql> show binlog events; +------------------+-----+----------------+-----------+-------------+---------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+-----+----------------+-----------+-------------+---------------------------------------+ | mysql-bin.000001 | 4 | Format_desc | 1 | 123 | Server ver: 5.7.17-log, Binlog ver: 4 | | mysql-bin.000001 | 123 | Previous_gtids | 1 | 154 | | | mysql-bin.000001 | 154 | Rotate | 1 | 201 | mysql-bin.000002;pos=4 | +------------------+-----+----------------+-----------+-------------+---------------------------------------+ 3 rows in set (0.00 sec)
查看某個特定binglog文件的內容
mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000002 | 154 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) mysql> flush logs; Query OK, 0 rows affected (0.01 sec) mysql> create database mood; Query OK, 1 row affected (0.00 sec) mysql> use mood;Database changed mysql> create table info (id int primary key auto_increment,name char(10) not null); Query OK, 0 rows affected (0.00 sec) mysql> insert into info (name)values('lisi'); Query OK, 1 row affected (0.01 sec) mysql> select *from info; +----+------+ | id | name | +----+------+ | 1 | lisi | +----+------+ 1 row in set (0.00 sec) mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000003 | 791 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) mysql> show binlog events in 'mysql-bin.000003'; +------------------+-----+----------------+-----------+-------------+------------------------------------------------------------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+-----+----------------+-----------+-------------+------------------------------------------------------------------------------------------+ | mysql-bin.000003 | 4 | Format_desc | 1 | 123 | Server ver: 5.7.17-log, Binlog ver: 4 | | mysql-bin.000003 | 123 | Previous_gtids | 1 | 154 | | | mysql-bin.000003 | 154 | Anonymous_Gtid | 1 | 219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' | | mysql-bin.000003 | 219 | Query | 1 | 313 | create database mood | | mysql-bin.000003 | 313 | Anonymous_Gtid | 1 | 378 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' | | mysql-bin.000003 | 378 | Query | 1 | 528 | use `mood`; create table info (id int primary key auto_increment,name char(10) not null) | | mysql-bin.000003 | 528 | Anonymous_Gtid | 1 | 593 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' | | mysql-bin.000003 | 593 | Query | 1 | 665 | BEGIN | | mysql-bin.000003 | 665 | Table_map | 1 | 715 | table_id: 219 (mood.info) | | mysql-bin.000003 | 715 | Write_rows | 1 | 760 | table_id: 219 flags: STMT_END_F | | mysql-bin.000003 | 760 | Xid | 1 | 791 | COMMIT /* xid=23 */ | +------------------+-----+----------------+-----------+-------------+------------------------------------------------------------------------------------------+ 11 rows in set (0.00 sec)
使用mysqlbinlog命令如何查看二進制日誌文件中的的內容
[root@localhost ~]# cd /usr/local/mysql/data/ //想進入data目錄下 [root@localhost data]# mysqlbinlog --no-defaults --base64-output=decode-rows –vmysql-bin.000003 //64位解碼查看二進制日誌 /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 4#180903 21:35:36 server id 1 end_log_pos 123 CRC32 0x42461cf1 Start: binlog v 4, server v 5.7.17-log created 180903 21:35:36# Warning: this binlog is either in use or was not closed properly. # at 123#180903 21:35:36 server id 1 end_log_pos 154 CRC32 0xec3d8563 Previous-GTIDs # [empty]# at 154#180903 21:37:18 server id 1 end_log_pos 219 CRC32 0xbc79d089 Anonymous_GTID last_committed=0 sequence_number=1SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/; # at 219#180903 21:37:18 server id 1 end_log_pos 313 CRC32 0xf7bec480 Query thread_id=3 exec_time=0 error_code=0SET TIMESTAMP=1535981838/*!*/;SET @@session.pseudo_thread_id=3/*!*/;SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;SET @@session.sql_mode=1437073414/*!*/;SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;/*!\C utf8 *//*!*/;SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;SET @@session.lc_time_names=0/*!*/;SET @@session.collation_database=DEFAULT/*!*/;create database mood/*!*/; # at 313#180903 21:37:26 server id 1 end_log_pos 378 CRC32 0x23338ada Anonymous_GTID last_committed=1 sequence_number=2SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/; # at 378#180903 21:37:26 server id 1 end_log_pos 528 CRC32 0x2abda936 Query thread_id=3 exec_time=0 error_code=0use `mood`/*!*/;SET TIMESTAMP=1535981846/*!*/;create table info (id int primary key auto_increment,name char(10) not null)/*!*/; # at 528#180903 21:37:51 server id 1 end_log_pos 593 CRC32 0xfb0a8540 Anonymous_GTID last_committed=2 sequence_number=3SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/; # at 593#180903 21:37:51 server id 1 end_log_pos 665 CRC32 0x092ccb69 Query thread_id=3 exec_time=0 error_code=0SET TIMESTAMP=1535981871/*!*/;BEGIN/*!*/; # at 665#180903 21:37:51 server id 1 end_log_pos 715 CRC32 0x7bc30dc3 Table_map: `mood`.`info` mapped to number 219# at 715#180903 21:37:51 server id 1 end_log_pos 760 CRC32 0x634de617 Write_rows: table id 219 flags: STMT_END_F ### INSERT INTO `mood`.`info` ### SET### @1=1### @2='lisi'# at 760#180903 21:37:51 server id 1 end_log_pos 791 CRC32 0x2b8944b4 Xid = 23COMMIT/*!*/;SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/; DELIMITER ; # End of log file/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
增量備份 是指在一次全備份或上一次增量備份後,之後每次的備份只需備份與前一次相比增長或者被修改的文件。這就意味着,第一次增量備份的對象是進行全備後所產生的增長和修改的文件;第二次增量備份的對象是進行第一次增量備份後所產生的增長和修改的文件,如此類推。這種備份方式最顯著的優勢就是:沒有重複的備份數據,所以備份的數據量不大,備份所需的時間很短。但增量備份的數據恢復是比較麻煩的。您必須具備上一次全備份和全部增量備份磁帶(一旦丟失或損壞其中的一個增量,就會形成恢復的失敗),而且它們必須沿着從全備份到依次增量備份的時間順序逐個反推恢復,所以這就極大地延長了恢復時間。
MYSQL數據庫在使用過程當中,通常都須要對使用的數據庫進行備份處理,對於數據量較小時能夠經過mysqldump命令進行數據庫全備份,可是當數據庫數據量達到必定程度以後,顯然增量備份更加適合。 假如咱們有一個數據庫,有20G的數據,天天會增長10M的數據,數據庫天天都要全量備份一次,這樣的話服務器的壓力比較大,所以咱們只須要備份增長的這部分數據,這樣減小服務器的負擔。
二、binlog簡介
binlog日誌由配置文件的 log-bin 選項負責啓用,MySQL服務器將在數據根目錄建立兩個新文 件XXX-bin.001和xxx-bin.index,若配置選項沒有給出文件名,Mysql將使用主機名稱命名這兩個文件,其中.index文件包含一份全體日誌文件的清單。
Mysql會把用戶對全部數據庫的內容和結構的修改狀況記入XXX-bin.n文件,而不會記錄 SELECT和沒有實際更新的UPDATE語句。
當MySQL數據庫中止或重啓時,服務器會把日誌文件記入下一個日誌文件,Mysql會在重啓時生成一個新的binlog日誌文件,文件序號遞增,此外,若是日誌文件超過max_binlog_size系統變量配置的上限時,也會生成新的日誌文件。
mysqlbinlog的經常使用的[options]: 1--start-time #起始時間 2--stop-time #結束時間 3--start-position #基於起始位置來顯示信息 4--stop-position #指定結束位置來顯示
下面作一個簡單的斷點恢復增量備份實例:
先看下基本環境
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mood | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec) mysql> use moodDatabase changed mysql> show tables; +----------------+ | Tables_in_mood | +----------------+ | info | +----------------+ 1 row in set (0.00 sec) mysql> select *from info; +----+------+ | id | name | +----+------+ | 1 | lisi | +----+------+ 1 row in set (0.00 sec) mysql> show binary logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 201 | | mysql-bin.000002 | 201 | | mysql-bin.000003 | 791 | +------------------+-----------+ 3 rows in set (0.00 sec)
首先進行一個徹底備份 [root@localhost data]# mysqldump -uroot -p mood > /opt/mood.sql Enter password:
刷新日誌生成尾號爲000004的新二進制日誌
[root@localhost data]# mysqladmin -uroot -p flush-logs Enter password: [root@localhost data]# ls auto.cnf ib_logfile1 mysql-bin.000001 mysql-bin.index sys ib_buffer_pool ibtmp1 mysql-bin.000002 mysql_error.logibdata1 mood mysql-bin.000003 mysql_olderror.logib_logfile0 mysql mysql-bin.000004 performance_schema
進入數據庫模擬一個誤操做,這裏誤操做爲刪除lisi這個條目。
mysql> use moodDatabase changed mysql> insert into info (name)values('test01'); Query OK, 1 row affected (0.00 sec) mysql> delete from info where name='lisi'; Query OK, 1 row affected (0.01 sec) mysql> insert into info (name)values('test02'); Query OK, 1 row affected (0.00 sec) mysql> select *from info; +----+--------+ | id | name | +----+--------+ | 2 | test01 | | 3 | test02 | +----+--------+ 2 rows in set (0.00 sec)
再次刷新日誌
[root@localhost data]# mysqladmin -u root -p flush-logs Enter password:
看到data下生產了新的000005日誌,可是咱們剛剛的操做是寫入了000004日誌中,咱們對00004日誌進行64位解碼並轉存位一個txt文件便於咱們查看。
[root@localhost data]# ls auto.cnf ibtmp1 mysql-bin.000003 mysql_olderror.logib_buffer_pool mood mysql-bin.000004 performance_schema ibdata1 mysql mysql-bin.000005 sys ib_logfile0 mysql-bin.000001 mysql-bin.indexib_logfile1 mysql-bin.000002 mysql_error.log [root@localhost data]# mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000004 > /opt/info.txt
再opt下vim查看生成出來的txt文件,也就是剛剛的000004日誌。
找到那條誤操做的命令,記錄下它以及先後位置的時間和位置數據。
操做時間 | 位置 | 類型 |
2018-09-03 22:15:31 | 341 | 正確操做一 |
2018-09-03 22:18:03 | 606 | 誤操做 |
2018-09-03 22:18:09 | 869 | 正確操做二 |
尋找位置如圖:
下面示範兩種跳過方式
1.經過時間識別
首先還原到徹底備份時的數據表狀態。
mysql> use mood Database changed mysql> drop table info; Query OK, 0 rows affected (0.01 sec) mysql> show tables; Empty set (0.00 sec) mysql> source /opt/mood.sql Query OK, 0 rows affected (0.00 sec) mysql> select *from info; +----+------+ | id | name | +----+------+ | 1 | lisi | +----+------+ 1 row in set (0.00 sec)
跳過刪除lisi那一步誤操做進行增量備份還原。
第一條命令:恢復到22.18.03(錯誤發生時間點)爲止!不執行錯誤時間點寫入的命令,後面一切命令也不執行。
第二條命令:從22.18.09 (下一條正確命令時間點)開始!前面一切命令不執行。
這樣咱們就跳過了哪一條delete命令
[root@localhost opt]# mysqlbinlog --no-defaults --stop-datetime='2018-09-03 22:18:03' /usr/local/mysql/data/mysql-bin.000004 | mysql -uroot -pEnter password: [root@localhost opt]# mysql -uroot -pabc123 -e 'use mood;select *from info;' mysql: [Warning] Using a password on the command line interface can be insecure. +----+--------+ | id | name | +----+--------+ | 1 | lisi | | 2 | test01 | +----+--------+ [root@localhost opt]# mysqlbinlog --no-defaults --start-datetime='2018-09-03 22:18:09' /usr/local/mysql/data/mysql-bin.000004 | mysql -uroot -pEnter password: [root@localhost opt]# mysql -uroot -pabc123 -e 'use mood;select *from info;' mysql: [Warning] Using a password on the command line interface can be insecure. +----+--------+ | id | name | +----+--------+ | 1 | lisi | | 2 | test01 | | 3 | test02 | +----+--------+
2.經過位置操做
仍是還原到徹底備份時的數據表狀態。
mysql> use moodDatabase changed mysql> drop table info; Query OK, 0 rows affected (0.01 sec) mysql> show tables; Empty set (0.00 sec) mysql> source /opt/mood.sql Query OK, 0 rows affected (0.00 sec) mysql> select *from info; +----+------+ | id | name | +----+------+ | 1 | lisi | +----+------+ 1 row in set (0.00 sec)
回頭看一下上面的表格,咱們得知:
錯誤操做的位置號是606,它的上一個操做位置號是556,下一個操做位置號是651
即:
556-606-651
那咱們只要跳過606便可!
操做以下:
[root@localhost opt]# mysqlbinlog --no-defaults --stop-position='556' /usr/local/mysql/data/mysql-bin.000004 | mysql -uroot -pabc123 mysql: [Warning] Using a password on the command line interface can be insecure. [root@localhost opt]# mysqlbinlog --no-defaults --start-position='651' /usr/local/mysql/data/mysql-bin.000004 | mysql -uroot -pabc123 mysql: [Warning] Using a password on the command line interface can be insecure. [root@localhost opt]# mysql -uroot -pabc123 -e 'use mood;select *from info;' mysql: [Warning] Using a password on the command line interface can be insecure. +----+--------+ | id | name | +----+--------+ | 1 | lisi | | 2 | test01 | | 3 | test02 | +----+--------+
完成!
ps:warning提示的是把密碼寫在命令中並不安全,這裏模擬試驗圖省事,你們實際操做仍是不要寫在命令中哦!