1. 程式人生 > 實用技巧 >二叉樹的中序遍歷

二叉樹的中序遍歷

目錄


一、日誌的作用及型別

MySQL日誌的作用

  • 排錯
  • 瞭解MySQL執行情況

MySQL日誌的型別

  • 錯誤日誌
  • 慢日誌
  • 查詢日誌
  • 二進位制日誌

二、錯誤日誌

記錄使用者登入和服務出錯相關的資訊,預設是開啟的。

可以在配置檔案中指定錯誤日誌的存放位置,確保啟動MySQL服務的使用者對這個目錄有寫許可權。

在配置檔案中配置錯誤日誌位置,使用log-error或log_error都可以

log-error=/var/log/mysql/mysql.log

如果沒有指定錯誤日誌,預設存放在MySQL的資料目錄下,以主機名.err作為檔名。

檢視錯誤日誌的詳細位置:

Charramma@(none) 11:51  mysql>show variables like 'log_error';
+---------------+--------------------------+
| Variable_name | Value                    |
+---------------+--------------------------+
| log_error     | /var/log/mysql/mysql.log |
+---------------+--------------------------+
1 row in set (0.00 sec)

Charramma@(none) 11:54  mysql>

什麼時候會寫錯誤日誌到日誌檔案中?

  • 登入失敗
  • 啟動過程出錯
  • 配置檔案出錯

三、慢日誌

作用:記錄了執行時間超過long_query_time引數值的sql語句,可以有效的幫助我們發現實際應用中sql的效能問題,找出執行效率低下的sql語句,為資料庫效能提升提供了線索。

慢日誌存放在資料目錄下,名字是主機名+slow.log

慢日誌預設是關閉的。

Charramma@(none) 15:21  mysql>show variables like 'slow_query_log';
+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| slow_query_log | OFF   |
+----------------+-------+
1 row in set (0.00 sec)

Charramma@(none) 15:22  mysql>

檢視long_query_time的值,預設為10秒

Charramma@(none) 16:10  mysql>show variables like 'long%';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.01 sec)

Charramma@(none) 16:10  mysql>

通過修改配置檔案開啟慢日誌。

vim /etc/my.cof

[mysqld]
# 開啟慢日誌
show_query_log = 1
# 設定超過1秒為慢日誌
log_query_time = 1
# 指定慢日誌的存放目錄
show_query_log_file=/data/mysql/mysql_slow.log

四、查詢日誌

查詢日誌記錄客戶端操作的所有sql語句,包括select查詢語句在內。預設關閉。

Charramma@(none) 21:53  mysql>show variables like 'general_log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| general_log   | OFF   |
+---------------+-------+
1 row in set (0.00 sec)

Charramma@(none) 21:53  mysql>

在配置檔案中開啟查詢日誌。

[mysqld]
general_log
general_log_file=/data/mysql/mysql_ge.log

預設存放在資料目錄下,名字是主機名+log。

由於查詢日誌紀錄了所有資料庫的操作,因此對於訪問頻繁的應用,該日誌會對系統性能造成一定影響,通常建議關閉此日誌。

缺點

  • 消耗大量磁碟空間

  • 消耗CPU、記憶體、磁碟資源

優點

  • 審計:會記錄所有的SQL操作

五、二進位制日誌(Binary Log)

1、什麼是二進位制日誌

MySQL二進位制日誌是一個二進位制檔案,主要記錄了資料庫的改動,如建表、資料改動等,並且記錄了語句發生的時間、執行市場、操作資料等其他額外資訊。

作用:

  • 資料恢復
  • 主從複製

二進位制日誌預設不開啟。

Charramma@(none) 19:35  mysql>show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | OFF   |
+---------------+-------+
1 row in set (0.00 sec)

Charramma@(none) 19:36  mysql>

可以在配置檔案中開啟二進位制日誌。

[mysqld]
# 開啟二進位制日誌
# 指定日誌檔案位置log_bin=/mysql/bin_log/mysql_binlog
log_bin
# 伺服器的標識id
server_id = 1

現在可以檢視二進位制日誌檔名了,如果沒有開啟二進位制日誌是查不到的。二進位制日誌檔案存放在資料目錄下,以主機名-bin.00000*為名

Charramma@(none) 19:36  mysql>show binary logs;
ERROR 1381 (HY000): You are not using binary logging

# ****** 開啟二進位制日誌後 *****

Charramma@(none) 19:41  mysql>show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)

Charramma@(none) 19:41  mysql>


Charramma@(none) 19:41  mysql>show binary logs;
+----------------------+-----------+
| Log_name             | File_size |
+----------------------+-----------+
| localhost-bin.000001 |      5755 |
+----------------------+-----------+
1 row in set (0.00 sec)

Charramma@(none) 19:41  mysql>

檢視二進位制日誌大小限制

Charramma@(none) 20:02  mysql>show variables like 'max_binlog_size';
+-----------------+------------+
| Variable_name   | Value      |
+-----------------+------------+
| max_binlog_size | 1073741824 |
+-----------------+------------+
1 row in set (0.00 sec)

Charramma@(none) 20:13  mysql>

2、二進位制日誌操作

  • 檢視當前伺服器所有的二進位制檔案

    Charramma@(none) 19:51  mysql>show binary logs;
    +----------------------+-----------+
    | Log_name             | File_size |
    +----------------------+-----------+
    | localhost-bin.000001 |    217592 |
    +----------------------+-----------+
    1 row in set (0.00 sec)
    
    Charramma@(none) 19:52  mysql>show master logs;
    +----------------------+-----------+
    | Log_name             | File_size |
    +----------------------+-----------+
    | localhost-bin.000001 |    218475 |
    +----------------------+-----------+
    1 row in set (0.00 sec)
    
    Charramma@(none) 19:52  mysql>
    
  • 檢視當前二進位制日誌檔案狀態

    最後(最新)一個binlog日誌的編號名稱,及其最後一個操作事件pos結束點(Position)值。

    Charramma@(none) 19:52  mysql>show master status;
    +----------------------+----------+--------------+------------------+-------------------+
    | File                 | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +----------------------+----------+--------------+------------------+-------------------+
    | localhost-bin.000001 |   241741 |              |                  |                   |
    +----------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    
    Charramma@(none) 19:53  mysql>
    
  • 重新整理日誌,產生一個新編號的二進位制日誌檔案

    Charramma@(none) 19:53  mysql>flush logs;
    Query OK, 0 rows affected (0.00 sec)
    
    Charramma@(none) 20:01  mysql>show master logs;
    +----------------------+-----------+
    | Log_name             | File_size |
    +----------------------+-----------+
    | localhost-bin.000001 |    411106 |
    | localhost-bin.000002 |      2214 |
    +----------------------+-----------+
    2 rows in set (0.00 sec)
    
    Charramma@(none) 20:01  mysql>
    
  • 重置所有二進位制日誌檔案

    Charramma@(none) 20:01  mysql>reset master;
    Query OK, 0 rows affected (0.06 sec)
    
    Charramma@(none) 20:02  mysql>show master logs;
    +----------------------+-----------+
    | Log_name             | File_size |
    +----------------------+-----------+
    | localhost-bin.000001 |       730 |
    +----------------------+-----------+
    1 row in set (0.00 sec)
    
    Charramma@(none) 20:02  mysql>
    

3、二進位制日誌的內容

檢視二進位制日誌的內容

# 檢視第一個binlog檔案的內容
Charramma@(none) 20:21  mysql>show binlog events;

# 檢視某個特定的binlog檔案的內容
Charramma@(none) 20:21  mysql>show binlog events in 'localhost-bin.000001' limit 3;
+----------------------+-----+----------------+-----------+-------------+---------------------------------------+
| Log_name             | Pos | Event_type     | Server_id | End_log_pos | Info                                  |
+----------------------+-----+----------------+-----------+-------------+---------------------------------------+
| localhost-bin.000001 |   4 | Format_desc    |         1 |         123 | Server ver: 5.7.29-log, Binlog ver: 4 |
| localhost-bin.000001 | 123 | Previous_gtids |         1 |         154 |                                       |
| localhost-bin.000001 | 154 | Anonymous_Gtid |         1 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'  |
+----------------------+-----+----------------+-----------+-------------+---------------------------------------+
3 rows in set (0.00 sec)

Charramma@(none) 20:21  mysql>
  • pos pos起始點
  • Event_type事件型別
  • server id 1 資料庫主機的服務號;
  • end_log_pos pos結束點
  • SET 執行的sql語句

3、二進位制日誌格式

二進位制日誌有三種格式:

  1. Stetament格式

    基於語句的,記錄操作的SQL語句。

    優點:

    • 日誌檔案較小
    • 便於閱讀與理解
    • 包含原始SQL,方便統計和審計

    缺點:

    • 可能導致主從不一致,存在安全隱患
    • 不能複製部分系統函式
    • 不支援不確定的SQL語句

    mysql5.7以前Statement是預設的格式

  2. Row格式

    記錄操作的每一行資料。

    優點:

    • 相對於Statement有更加安全的複製格式
    • 系統的特殊函式也可以複製
    • 更少的鎖
    • 資料一致性高

    缺點:

    • 日誌檔案比較大
    • 無法看見使用者執行的SQL

    mysql5.7之後,預設的格式為Row格式

  3. MIXED格式

    一種混合格式,混合使用Row和Statement格式,對DDL記錄會使用Statement,對於table裡的行操作會記錄Row格式。如果是Innodb表,事務級別為Read committed 或者 read uncommitted日誌級別只能使用Row格式。