數據庫篇-錯誤日誌

1. 錯誤日誌

1.1 : 作用

記錄啓動\關閉\日常運行過程中,狀態信息,警告,錯誤

1.2 : 錯誤日誌配置

默認就是開啓的: /數據路徑下/hostname.err

手工設定:

Master [(none)]>select @@log_error;
vim /etc/my.cnf
log_error=/var/log/mysql.log
log_timestamps=system

重啓生效

show variables like 'log_error';

1.3 : 日誌內容查看

主要關注[ERROR],看上下文

2. binlog(binary logs):二進制日誌

2.1 : 作用

  • (1)備份恢復必須依賴二進制日誌
  • (2)主從環境必須依賴二進制日誌

2.2 : binlog配置 (5.7必須加server_id)

注意:MySQL默認是沒有開啓二進制日誌的。
基礎參數查看:

開關:
[(none)]>select @@log_bin;
日誌路徑及名字
[(none)]>select @@log_bin_basename;
服務ID號:
[(none)]>select @@server_id;
二進制日誌格式:
[(none)]>select @@binlog_format;
雙一標準之二:
[(none)]>select @@sync_binlog;

2.2.1 : 創建日誌目錄

mkdir /data/binlog
chown -R mysql.mysql /data/binlog

2.2.2 : 修改配置文件

vim /etc/my.cnf
server_id=6   ----->5.6中,單機可以不需要此參數              
log_bin=/data/binlog/mysql-bin
binlog_format=row

2.2.3 : 重啓數據庫生效

[root@db01 mysql]# /etc/init.d/mysqld restart

2.2.4 : 參數說明

server_id=3306 
主要是在主從複製過程中必須要加的,但是在5.7版本中,要用以下參數(log_bin),開啓binlog日誌,即使是單機也是必加的
log_bin=/data/binlog/mysql-bin
(1)開啓二進制日誌功能
(2)設置二進制日誌目錄及名稱前綴
binlog_format=row
binlog的記錄格式??

2.3 : binlog記錄了什麼?

2.3.1 : 引入

binlog是SQL層的功能。記錄的是變更SQL語句,不記錄查詢語句。

2.3.2 : 記錄SQL語句種類

DDL :原封不動的記錄當前DDL(statement語句方式)。
DCL :原封不動的記錄當前DCL(statement語句方式)。
DML :只記錄已經提交的事務DML

2.3.3 : DML三種記錄方式

binlog_format(binlog的記錄格式)參數影響

  • (1)statement(5.6默認)SBR(statement based replication) 語句模式原封不動的記錄當前DML。
  • (2)ROW (5.7 默認值) RBR(ROW based replication) 記錄數據行的變化(用戶看不懂,需要工具分析)
  • (3)mixed(混合)MBR(mixed based replication)模式 :以上兩種模式的混合

2.4 : event(事件)是什麼?

2.4.1 : 事件的簡介

二進制日誌的最小記錄單元

對於DDL,DCL,一個語句就是一個event
對於DML語句來講:只記錄已提交的事務。

例如以下列子,就被分爲了4個event

begin;      120  - 340
DML1        340  - 460
DML2        460  - 550
commit;     550  - 760

2.4.2 : event的組成

三部分構成:

  • (1) 事件的開始標識
  • (2) 事件內容
  • (3) 事件的結束標識

Position:
開始標識: at 194
結束標識: end_log_pos 254

194? 254?
某個事件在binlog中的相對位置號

位置號的作用是什麼?
爲了方便我們截取事件

2.5 日誌文件查看

2.5.1 : 查看日誌的開啓情況

log_bin參數設置的路徑,可以找到二進制日誌

Master [(none)]>show variables like '%log_bin%';
+---------------------------------+------------------------------+
| Variable_name                   | Value                        |
+---------------------------------+------------------------------+
| log_bin                         | ON                           |
| log_bin_basename                | /data/binlog/mysql-bin       |
| log_bin_index                   | /data/binlog/mysql-bin.index |
| log_bin_trust_function_creators | OFF                          |
| log_bin_use_v1_row_events       | OFF                          |
| sql_log_bin                     | ON                           |
+---------------------------------+------------------------------+
6 rows in set (0.01 sec)

2.5.2 : 查看一共多少個binlog

Master [(none)]>show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       154 |
+------------------+-----------+
1 row in set (0.01 sec)

Master [(none)]>flush logs;
Query OK, 0 rows affected (0.03 sec)

Master [(none)]>flush logs;
Query OK, 0 rows affected (0.01 sec)

Master [(none)]>show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       201 |
| mysql-bin.000002 |       201 |
| mysql-bin.000003 |       154 |
+------------------+-----------+
3 rows in set (0.00 sec)

Master [(none)]>

2.5.3 : 查看mysql正在使用的日誌文件

Master [(none)]>show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---*斜體樣式*---------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
Master [(none)]>

file: 當前MySQL正在使用的文件名
Position:最後一個事件的結束位置號

2.6 : 日誌內容查看

2.6.1 : event查看

Master [binlog]>show binlog events in 'mysql-bin.000003';
+------------------+-----+----------------+-----------+-------------+----------------------------------------+
| Log_name         | Pos | Event_type     | Server_id | End_log_pos | Info                                   |
+------------------+-----+----------------+-----------+-------------+----------------------------------------+
| mysql-bin.000003 |   4 | Format_desc    |         6 |         123 | Server ver: 5.7.20-log, Binlog ver: 4  |
| mysql-bin.000003 | 123 | Previous_gtids |         6 |         154 |                                        |
| mysql-bin.000003 | 154 | Anonymous_Gtid |         6 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'   |
| mysql-bin.000003 | 219 | Query          |         6 |         319 | create database binlog                 |
| mysql-bin.000003 | 319 | Anonymous_Gtid |         6 |         384 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'   |
| mysql-bin.000003 | 384 | Query          |         6 |         486 | use `binlog`; create table t1 (id int) |
+------------------+-----+----------------+-----------+-------------+----------------------------------------+

Log_name:binlog文件名
Pos:開始的position
Event_type:事件類型
Format_desc:格式描述,每一個日誌文件的第一個事件,多用戶沒有意義,

MySQL識別binlog必要信息

Server_id:mysql服務號標識
End_log_pos:事件的結束位置號
Info:事件內容

補充:

SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
[root@db01 binlog]# mysql -e "show binlog events in 'mysql-bin.000004'" |grep drop

2.6.2 : binlog文件內容詳細查看

mysqlbinlog /data/mysql/mysql-bin.000006
mysqlbinlog --base64-output=decode-rows -vvv /data/binlog/mysql-bin.000003
mysqlbinlog  -d binlog /data/binlog/mysql-bin.000003
[root@db01 binlog]# mysqlbinlog --start-datetime='2019-05-06 17:00:00' --stop-datetime='2019-05-06 17:01:00'  /data/binlog/mysql-bin.000004 

2.7 : 基於Position號進行日誌截取

核心就是找截取的起點和終點

--start-position=321
--stop-position=513
 mysqlbinlog --start-position=219 --stop-position=1347 /data/binlog/mysql-bin.000003 >/tmp/bin.sql

案例: 使用binlog日誌進行數據恢復

模擬:

1. 
[(none)]>create database binlog charset utf8;
2. 
[(none)]>use binlog;
[binlog]>create table t1(id int);
3. 
[binlog]>insert into t1 values(1);
[binlog]>commit;
[binlog]>insert into t1 values(2);
[binlog]>commit;
[binlog]>insert into t1 values(3);
[binlog]>commit;
4. 
[binlog]>drop database binlog;

恢復:

[(none)]>show master status ;
[(none)]>show binlog events in 'mysql-bin.000004';
[root@db01 binlog]# mysqlbinlog --start-position=1227 --stop-position=2342 /data/binlog/mysql-bin.000004 >/tmp/bin.sql
[(none)]>set sql_Log_bin=0;
[(none)]>source /tmp/bin.sql

2.8 : binlog日誌的GTID新特性

2.8.1 : GTID 介紹

  • 5.6 版本新加的特性,5.7中做了加強
  • 5.6 中不開啓,沒有這個功能.
  • 5.7 中的GTID,即使不開也會有自動生成
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'

2.8.2 : GTID(Global Transaction ID)

是對於一個已提交事務的編號,並且是一個全局唯一的編號。

它的官方定義如下:

GTID = source_id :transaction_id
7E11FA47-31CA-19E1-9E56-C43AA21293967:29

重要參數介紹:

vim /etc/my.cnf
gtid-mode=on
enforce-gtid-consistency=true
systemctl restart mysqld

Master [(none)]>create database gtid charset utf8;
Query OK, 1 row affected (0.01 sec)

Master [(none)]>show master status ;
+------------------+----------+--------------+------------------+----------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                      |
+------------------+----------+--------------+------------------+----------------------------------------+
| mysql-bin.000004 |      326 |              |                  | dff98809-55c3-11e9-a58b-000c2928f5dd:1 |
+------------------+----------+--------------+------------------+----------------------------------------+
1 row in set (0.00 sec)

Master [(none)]>use gtid
Database changed
Master [gtid]>create table t1 (id int);
Query OK, 0 rows affected (0.01 sec)

Master [gtid]>show master status ;
+------------------+----------+--------------+------------------+------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000004 |      489 |              |                  | dff98809-55c3-11e9-a58b-000c2928f5dd:1-2 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)

Master [gtid]>create table t2 (id int);
Query OK, 0 rows affected (0.01 sec)

Master [gtid]>create table t3 (id int);
Query OK, 0 rows affected (0.02 sec)

Master [gtid]>show master status ;
+------------------+----------+--------------+------------------+------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000004 |      815 |              |                  | dff98809-55c3-11e9-a58b-000c2928f5dd:1-4 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)

Master [gtid]>begin;
Query OK, 0 rows affected (0.00 sec)

Master [gtid]>insert into t1 values(1);
Query OK, 1 row affected (0.00 sec)

Master [gtid]>commit;
Query OK, 0 rows affected (0.00 sec)

Master [gtid]>show master status ;
+------------------+----------+--------------+------------------+------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000004 |     1068 |              |                  | dff98809-55c3-11e9-a58b-000c2928f5dd:1-5 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)

Master [gtid]>begin;
Query OK, 0 rows affected (0.00 sec)

Master [gtid]>insert into t2 values(1);
Query OK, 1 row affected (0.00 sec)

Master [gtid]>commit;
Query OK, 0 rows affected (0.01 sec)

Master [gtid]>show master status ;
+------------------+----------+--------------+------------------+------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000004 |     1321 |              |                  | dff98809-55c3-11e9-a58b-000c2928f5dd:1-6 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)

2.8.3 : 基於GTID進行查看binlog

具備GTID後,截取查看某些事務日誌:

--include-gtids  #包含的 GTID節點
--exclude-gtids  #去除的 GTID節點
mysqlbinlog --include-gtids='dff98809-55c3-11e9-a58b-000c2928f5dd:1-6' --exclude-gtids='dff98809-55c3-11e9-a58b-000c2928f5dd:4'  /data/binlog/mysql-bin.000004

2.8.4 : GTID的冪等性

開啓GTID後,MySQL恢復Binlog時,重複GTID的事務不會再執行了
就想恢復?怎麼辦?

--skip-gtids  #忽略 GTID 的一致性特性
mysqlbinlog --include-gtids='3ca79ab5-3e4d-11e9-a709-000c293b577e:4' /data/binlog/mysql-bin.000004 /data/binlog/mysql-bin.000004
set sql_log_bin=0;
source /tmp/binlog.sql #恢復數據
set sql_log_bin=1;

2.9 : 使用二進制日誌恢復數據案例

2.9.1 : 故障環境介紹

創建了一個庫 db, 導入了表t1 ,t1表中錄入了很多數據
一個開發人員,drop database db;

沒有備份,日誌都在.怎麼恢復?

思路: 找到建庫語句到刪庫之前所有的日誌,進行恢復.(開啓了GTID模式)

故障案例模擬:

(0) drop database if exists db ;
(1) create database db charset utf8;     
(2) use db;
(3) create table t1 (id int);
(4) insert into t1 values(1),(2),(3);
(5) insert into t1 values(4),(5),(6);
(6) commit
(7) update t1 set id=30 where id=3;
(8) commit;
(9) delete from t1 where id=4;
(10)commit;
(11)insert into t1 values(7),(8),(9);
(12)commit;
(13)drop database db;
========================
drop database if exists db ;
create database db charset utf8; 
use db;
create table t1 (id int);
insert into t1 values(1),(2),(3);
insert into t1 values(4),(5),(6);
commit;
update t1 set id=30 where id=3;
commit;
delete from t1 where id=4;
commit;
insert into t1 values(7),(8),(9);
commit;
drop database db;
=======

運行以上語句,模擬故障場景
需求:將數據庫恢復到以下狀態(提示第9步和第13步是誤操作,其他都是正常操作)

2.9.2 : 恢復過程(無GTID時的恢復)

1.查看當前使用的 binlog文件

oldguo [db]>show master status ;
+------------------+----------+--------------+------------------+-------------------+

| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000006 |    1873 |              |                  |                  |

+------------------+----------+--------------+------------------+-------------------+

2.查看事件:

第一段

| mysql-bin.000006 |  813 | Query      |        1 |        907 | use `db`; create table t1 (id int)                  |

| mysql-bin.000006 |  907 | Query      |        1 |        977 | BEGIN                                              |

| mysql-bin.000006 |  977 | Table_map  |        1 |        1020 | table_id: 77 (db.t1)                                |

| mysql-bin.000006 | 1020 | Write_rows  |        1 |        1070 | table_id: 77 flags: STMT_END_F                      |

| mysql-bin.000006 | 1070 | Table_map  |        1 |        1113 | table_id: 77 (db.t1)                                |

| mysql-bin.000006 | 1113 | Write_rows  |        1 |        1163 | table_id: 77 flags: STMT_END_F                      |

| mysql-bin.000006 | 1163 | Xid        |        1 |        1194 | COMMIT /* xid=74 */                                |

| mysql-bin.000006 | 1194 | Query      |        1 |        1264 | BEGIN                                              |

| mysql-bin.000006 | 1264 | Table_map  |        1 |        1307 | table_id: 77 (db.t1)                                |

| mysql-bin.000006 | 1307 | Update_rows |        1 |        1353 | table_id: 77 flags: STMT_END_F                      |

| mysql-bin.000006 | 1353 | Xid        |        1 |        1384 | COMMIT /* xid=77 */   

mysqlbinlog --start-position=813 --stop-position=1384 /data/mysql/mysql-bin.000006 >/tmp/bin1.sql 

第二段:


| mysql-bin.000006 | 1568 | Query      |        1 |        1638 | BEGIN                                              |

| mysql-bin.000006 | 1638 | Table_map  |        1 |        1681 | table_id: 77 (db.t1)                                |

| mysql-bin.000006 | 1681 | Write_rows  |        1 |        1731 | table_id: 77 flags: STMT_END_F                      |

| mysql-bin.000006 | 1731 | Xid        |        1 |        1762 | COMMIT /* xid=81 */ 

mysqlbinlog --start-position=1568 --stop-position=1762 /data/mysql/mysql-bin.000006 >/tmp/bin2.sql

恢復:

set sql_log_bin=0;
source /tmp/bin1.sql
source /tmp/bin2.sql
set sql_log_bin=1;
oldguo [db]>select * from t1;

+------+

| id  |

+------+

|    1 |

|    2 |

|  30 |

|    4 |

|    5 |

|    6 |

|    7 |

|    8 |

|    9 |

2.9.3 : 有GTID的恢復

1.截取

mysqlbinlog --skip-gtids --include-gtids='3ca79ab5-3e4d-11e9-a709-000c293b577e:7-12' mysql-bin.000004> /tmp/bin.sql

2.恢復

set sql_log_bin=0;
source /tmp/bin.sql

2.10 : 二進制日誌其他操作

2.10.1 : 自動清理日誌

show variables like '%expire%';
expire_logs_days  0   

自動清理時間,是要按照全備週期+1

set global expire_logs_days=8;
永久生效:
my.cnf
expire_logs_days=15;

企業建議,至少保留兩個全備週期+1 的 binlog

2.10.2 : 手工清理

PURGE BINARY LOGS BEFORE now() - INTERVAL 3 day;
PURGE BINARY LOGS TO 'mysql-bin.000010';

注意:不要手工 rm binlog文件

1. my.cnf binlog關閉掉,啓動數據庫
2.把數據庫關閉,開啓binlog,啓動數據庫

刪除所有binlog,並從000001開始重新記錄日誌

2.10.3 : 日誌是怎麼滾動

flush logs; 

重啓mysql也會自動滾動一個新的日誌文件達到1G大小(max_binlog_size)

| max_binlog_size                          | 1073741824     

備份時,加入參數也可以自動滾動

原文地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章