mysql中的日誌主要分為以下幾種:
查詢日誌
慢查詢日誌
錯誤日誌
二進位制日誌
中繼日誌
事務日誌
說明:支援本文實驗使用的linux系統是centos7版本,使用的資料庫是base源自帶的mariadb,資料庫使用的儲存引擎使用預設的innodb
1、查詢日誌
記錄查詢語句、日誌儲存位置
日誌的存放位置有兩個地方:一是儲存在指定檔案中,一是儲存在指定的表中。考慮到i/o壓力,一般二者不會同時記錄mariadb [mysql]> show variables like 'general%';
| variable_name | value |
| general_log | on |
| general_log_file | centos7.log |
2 rows in set (0.00 sec)
#general_log預設是關閉的
從上述**可以看出,查詢日誌具有兩個變數;
下面來檢視general_log表的詳細資訊:mariadb [mysql]> desc general_log;
| field | type | null | key | default | extra |
| event_time | timestamp(6) | no | | current_timestamp | on update current_timestamp |
| user_host | mediumtext | no | | null | |
| thread_id | int(11) | no | | null | |
| server_id | int(10) unsigned | no | | null | |
| command_type | varchar(64) | no | | null | |
| argument | mediumtext | no | | null | |
6 rows in set (0.00 sec)
事件時間
使用者主機
事件的程序id
服務id
命令型別
引數以上這些資訊構成了general_log的主要內容,即記錄的查詢日誌的操作內容可以通過上述資訊顯示set @@global.general_log=on;
#預設此變數是全域性的,但是修改後能夠立即生效
開啟查詢日誌後,接著我們進行一些查詢操作如:select user,host,password from mysql.user;
這些查詢操作就會被記錄到日誌檔案centos7.log檔案中,此檔案是預設檔案可以修改。而此檔案的存放路徑是相對路徑即/var/lib/mysql/cat /var/lib/mysql/centos7.log
#能看到記錄的查詢操作了
以上演示的是日誌資訊記錄在檔案中,日誌還可以記錄在指定表中,只要修改乙個變數即可:set @@global.log_output=table;
#預設是file
關於表的日誌記錄與檔案記錄類似,不再演示
2、慢查詢日誌
慢查詢:一條查詢指令執行時間超出一定時長的操作,這種操作會對使用者的體驗大打折扣,應該盡量避免
一般建議啟動此慢查詢日誌功能mariadb [mysql]> select @@global.long_query_time;
| @@global.long_query_time |
| 10.000000 |
1 row in set (0.00 sec)
預設的慢查詢時間是10秒鐘select @@global.slow_query_log;
#預設關閉慢查詢日誌
select @@global.slow_query_log_file;
#預設檔名稱為主機名-slow.log,如centos7-slow.log
select @@global.log_output;
#預設是檔案記錄
並不是所有的指令執行時間超過10秒鐘都會記錄,其是有乙個過濾器的select @@global.log_slow_filter;
#此變數指定的指令才會使用慢查詢
慢查詢日誌的用法與general_log的基本相同,不再贅述
3、錯誤日誌
顧名思義,記錄錯誤資訊,主要記錄如下幾類資訊:
(1) mysqld啟動和關閉過程中輸出的資訊;
(2) mysqld執行中產生的錯誤資訊;
(3) event scheduler執行時產生的資訊;
(4) 主從複製架構中,從伺服器複製執行緒啟動時產生的日誌;
錯誤日誌是否開啟,可以使用下述命令檢視select @@global.log_error;
#預設是開啟的,即指定具體日誌檔案路徑 如/var/log/mariadb/mariadb.log
#如果未開啟,則查詢的結果是off
4、二進位制日誌
用於記錄引起資料改變或存在引起資料改變的潛在可能性的語句(statement)或改變後的結果(row),也可能是二者混合;
作用:重放 (replay),即發生故障時可以使用二進位制日誌重新操作一遍故障發生前的指令
試想一下,在進行了全量備份資料庫後,過了一天主資料庫裝置突然出現故障,這時我們雖然能夠使用全量備份來恢復資料庫,但是前一天的資料還未來得及備份,也就是說
少了一天的資料,這種情況下就可以使用二進位制日誌恢復缺失的一天的資訊;
下面舉個例子說明二進位制日誌在資料恢復中的重要作用:建立資料庫、表,插入資料create database rdbms;
use rdbms;
create table tbl (id int primary key,name char(30) not null,age int not null);
insert into tbl values (1,'xiao wang',20),(2,'xiao li',22);檢查資訊mariadb [rdbms]> desc tbl;
| field | type | null | key | default | extra |
| id | int(11) | no | pri | null | |
| name | char(30) | no | | null | |
| age | int(11) | no | | null | |
3 rows in set (0.00 sec)
mariadb [rdbms]> select * from tbl;
| id | name | age |
| 1 | xiao wang | 20 |
| 2 | xiao li | 22 |
2 rows in set (0.00 sec)修改mysql的服務配置檔案,開啟二進位制日誌功能rpm -ql mariadb-server
#可以查到配置檔案的位置
vim /etc/my.cnf.d/server.cnf
[server]
#指定二進位制日誌的存放路徑,之所以在配置檔案修改而不用命令列,是因為命令列不支援開啟二進位制日誌功能
#檢視二進位制日誌檔案列表
show master status;
#檢視當前正在使用的二進位制日誌檔案
show binlog events in 'master-log.000001';
#檢視二進位制日誌檔案的事件資訊將當前資料庫進行全量備份mysqlbinlog -uroot -p master-log.000001 > /root/binlog.sql
#binlog.sql就是備份的資料庫檔案
#mysqlbinlog是mysql自帶的二進位制日誌工具
當在全新的備份伺服器上就行恢復時mysql
按上述方式恢復即可
#-j 指定開始位置
#--stop-position指定結束位置
檢視的內容包含以下資訊:
事件的起始位置# at 553
事件發生的伺服器id:server id 1
事件的結束位置:end_log_pos 624
事件的型別:query
事件發生時所在伺服器執行此事件的執行緒的id: thread_id=2
語句的時間戳與將其寫入二進位制日誌檔案中的時間差:exec_time=0
錯誤**:error_code=0
設定事件發生時的時間戳:set timestamp=1472608568/*!*/;
事件內容:begin
以上就是關於mysql日誌的簡單介紹
mysql物理id mysql物理結構
mysql是通過檔案系統對資料和索引進行儲存的。mysql從物理結構上可以分為日誌檔案和資料索引檔案。mysql在linux中的資料索引檔案和日誌檔案都在 var lib mysql目錄下。日誌檔案採用順序io方式儲存 資料檔案採用隨機io方式儲存。首先可以檢視mysql的檔案在linux中的那個目...
mysql 多個 Id MySQL查詢多個ID
從您的問題來看,我相信您當前的表結構如下 table user table project table shared id email id user id content id user id project id 1 james website.com 1 1 project for james...
mysql 排序id mysql怎麼按特定id排序
mysql如何按特定id排序 mysql如何按特定id排序 set foreign key checks 0 table structure for p drop table if exists p create table p id int 11 not null auto increment,n...