MySQL基操---深刻淺出增量斷點備份與日誌管理

-----------------------------日誌-----------------------------------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 正確操做二

尋找位置如圖:

10903223336.jpeg

下面示範兩種跳過方式

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提示的是把密碼寫在命令中並不安全,這裏模擬試驗圖省事,你們實際操做仍是不要寫在命令中哦!

相關文章
相關標籤/搜索