MySQL資料庫檔案
本文檔從MySQL資料庫和存儲引擎層面介紹各種類型的檔案。
- 參數檔案(my.cnf)
- 錯誤日志(error log)
- 二進制日志檔案(binary log)
- 慢查詢日志(slow log)
- 全量日志(general log)
- 審計日志(audit log)
- 中繼日志(relay log)
- Pid檔案
- Socket檔案
- 表結構檔案
- InnoDB存儲引擎檔案
1. 參數檔案
在MySQL執行個體啟動時,資料庫會先去讀一個配置參數檔案,用來尋找資料庫的各種檔案所在位置以及指定某些初始化參數。在預設情況下,MySQL執行個體會按照一定的順序在指定的位置進行讀取。
# mysql --help|grep my.cnf
...
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
如果想指定預設的參數檔案,需要配合
--defaults-file
選項,如:
下面介紹一下常見參數檔案
/etc/my.cnf
中的參數的含義。
-
[client]
用來配置MySQL用戶端的參數,MySQL用戶端指所有連接配接mysql的程式
-
port = 3306
指MySQL使用的預設端口号
-
socket = /tmp/mysql3306.sock
指在/tmp目錄建立socket檔案mysql3306.sock
-
[mysql]
表示配置MySQL的mysql用戶端程式
-
prompt=”\U [\d] \R:\m:\s> “
格式化mysql提示符
-
no-auto-rehash
不會讀取全部meta data。
-
[mysqld]
表示配置MySQL的mysqld用戶端程式
-
user = mysql
以mysql使用者運作mysqld伺服器。
-
port = 3306
指MySQL使用的預設端口号
-
basedir = /usr/local/mysql
MySQL安裝目錄的路徑。
-
datadir = /data/mysql/mysql3306/data
MySQL伺服器資料目錄的路徑
-
tmpdir = /data/mysql/mysql3306/tmp
用于建立臨時檔案的目錄的路徑。
-
socket = /tmp/mysql3306.sock
指在/tmp目錄建立socket檔案mysql3306.sock
-
pid-file = mysqldb1.pid
MySQL程序辨別檔案名,如果沒指定目錄,則存放在資料目錄下。
-
character-set-server = utf8mb4
使用utf8mb4作為預設伺服器字元集
-
skip_name_resolve = 0
表示所有的ip連接配接mysql,不會進行dns反解析。可以加速用戶端連接配接的速度。
-
open_files_limit = 65535
mysqld可用的檔案描述符數。
-
back_log = 1024
表示在MySQL暫時停止應答新請求之前的短時間内可以堆疊多少個請求。
預設值為’-1’,根據公式
進行計算,上限900。人為幹預的最大值為6553550 + (max_connections / 5)
-
max_connections = 512
允許的最大同時用戶端連接配接數
-
max_connect_errors = 1000000
預設值為100。表示如果來自主機的多個連續連接配接請求在沒有成功連接配接的情況下中斷,則伺服器會阻止該主機進一步連接配接。
您可以通過重新整理主機緩存來取消阻止阻止的主機。 為此,請發出FLUSH HOSTS語句或執行mysqladmin flush-hosts指令。
如果在上一次連接配接中斷後,在少于max_connect_errors次嘗試的情況下成功建立連接配接,則主機的錯誤計數将清零。
但是,一旦主機被阻止,重新整理主機緩存是解除阻塞的唯一方法。 預設值為100。
-
table_open_cache = 1024
作業系統允許mysqld打開的檔案數。 此變量在運作時的值是系統允許的實際值,可能與您在伺服器啟動時指定的值不同。
-
table_definition_cache = 1024
可以存儲在定義高速緩存中的表定義(來自.frm檔案)的數量。
如果使用大量表,則可以建立大型表定義高速緩存以加快表的打開速度。 與普通表緩存不同,表定義緩存占用的空間更少,不使用檔案描述符。
最小值為400。預設值基于以下公式,上限為2000:
400 + (table_open_cache / 2)
-
table_open_cache_instances = 16
打開表緩存執行個體的數量。 為了通過減少會話之間的争用來提高可伸縮性,可以将打開表緩存劃分為幾個較小的緩存執行個體,
其大小為table_open_cache / table_open_cache_instances。 會話需要僅鎖定一個執行個體以通路DML語句。
這會在執行個體之間對高速緩存進行分段,進而在有許多會話通路表時允許使用高速緩存的操作具有更高的性能。 (DDL語句仍然需要鎖定整個緩存,但這些語句比DML語句要頻繁得多。)
對于正常使用16個或更多核心的系統,建議使用值8或16。
-
thread_stack = 512K
每個線程的堆棧大小。 預設值192KB(64位系統為256KB)足以進行正常操作。
如果線程堆棧大小太小,則會限制伺服器可以處理的SQL語句的複雜性,存儲過程的遞歸深度以及其他消耗記憶體的操作。
-
external-locking = FALSE
啟用外部鎖定(系統鎖定),預設情況下禁用。外部鎖定僅影響MyISAM表通路。
-
max_allowed_packet = 32M
限制server接受的資料包的大小。如果寫入大資料時,因為預設的配置太小,
插入和更新操作會因為 max_allowed_packet 參數限制,而導緻失敗。
預設值4MB
-
sort_buffer_size = 4M
必須執行排序的每個會話都會配置設定此大小的緩沖區。
如果在SHOW GLOBAL STATUS輸出中看到每秒許多Sort_merge_passes,您可以考慮增加sort_buffer_size值以加快使用查詢優化或改進的索引而無法改進的ORDER BY或GROUP BY操作。
-
join_buffer_size = 4M
應用在經常會出現一些兩表(或多表)join的操作需求,MySQL在完成某些join需求的時候(all row join/all index /scan join)
為了減少參與join的“被驅動表”的讀取次數以提高性能,需要使用到join buffer來協助完成join操作當join buffer 太小,
MySQL不會将該buffer存入磁盤檔案而是先将join buffer中的結果與需求join的表進行操作,
然後清空join buffer中的資料,繼續将剩餘的結果集寫入次buffer中,如此往複,這勢必會造成被驅動表需要被多次讀取,成倍增加IO通路,
降低效率(執行計劃中如果現實using join buffer)兩個表關聯的時候 減少參與被驅動表的join操作(沒辦法有效利用索引的時候)
多表join時,就需要用到join buffer的三種情況:
- All row join do not user indexes nad thus perform full table scans(沒有索引的全表掃描)
- All index join plain index scans(普通索引掃描),
- Range index scan join=rangeindex scans(範圍索引掃描),
最好是添加适當的索引而不是純粹加大join_buffer_size
任何兩個表間的全表join就會配置設定一次join_buffer也就是說,如果3個表join就會配置設定2次join buffer(而不是一個session隻配置設定一次)
-
thread_cache_size = 768
表示可以重新利用儲存在緩存中線程的數量,當斷開連接配接時如果緩存中還有空間,那麼用戶端的線程将被放到緩存中,如果線程重新被請求,那麼請求将從緩存中讀取,如果緩存中是空的或者是新的請求,
那麼這個線程将被重新建立,如果有很多新的線程,增加這個值可以改善系統性能.
預設值-1,表示根據公式
自動調整,上限值為100。最大值163848 + (max_connections / 100)
-
interactive_timeout = 600
伺服器在關閉之前等待互動式連接配接上的活動的秒數。 預設值8小時,太大需調整,需跟wait_timeout一起調整,且值要一緻。
-
wait_timeout = 600
伺服器在關閉之前等待非互動式連接配接上的活動的秒數。預設值8小時,太大需調整,需跟interactive_timeout一起調整,且值要一緻。
-
tmp_table_size = 32M
内部記憶體臨時表最大大小。實際限制是根據tmp_table_size和max_heap_table_size的較小值确定的。
如果有許多GROUP BY查詢并且消耗大量記憶體,則可以增加tmp_table_size(如果需要,還有max_heap_table_size)的值。
-
max_heap_table_size = 32M
管理heap、memory存儲引擎表,此變量還與tmp_table_size結合使用,以限制内部記憶體表的大小
-
log-error = /data/mysql/mysql3306/error.log
錯誤日志檔案名
-
slow_query_log = 1
表示啟用慢查詢日志。
-
slow_query_log_file = /data/mysql/mysql3306/slow.log
慢查詢日志檔案的名稱。
-
long_query_time = 0.1
如果查詢花費的時間超過此秒數,則伺服器會增加Slow_queries狀态變量。
如果啟用了慢查詢日志,則查詢将記錄到慢查詢日志檔案中。
預設值10s
-
log_queries_not_using_indexes =1
如果運作的SQL語句沒有使用到索引,則MySQL資料庫會将這條SQL語句記錄到慢查詢日志檔案中。
-
log_throttle_queries_not_using_indexes = 60
如果啟用了log_queries_not_using_indexes,
則log_throttle_queries_not_using_indexes變量會限制可寫入慢查詢日志的每分鐘此類查詢的數量。 值0(預設值)表示“無限制”。
-
min_examined_row_limit = 100
查詢檢查傳回少于該參數指定行的SQL不被記錄到慢查詢日志
-
log_slow_admin_statements = 1
在寫入慢查詢日志的語句中包含慢速管理語句。管理語句包括ALTER TABLE,ANALYZE TABLE,CHECK TABLE,CREATE INDEX,DROP INDEX,OPTIMIZE TABLE和REPAIR TABLE。
-
log_slow_slave_statements = 1
啟用慢速查詢日志時,此變量将啟用對slave伺服器上執行的查詢超過long_query_time秒的日志記錄。 這個變量是在MySQL 5.7.1中添加的。 設定此變量不會立即生效。 變量的狀态适用于所有後續START SLAVE語句。
請注意,即使啟用了log_slow_slave_statements,主伺服器中以行格式記錄的所有語句也不會記錄在slave的慢查詢日志中。
-
server-id = 1003306
伺服器id,如果啟用binlog,則必須設定該值。
-
log-bin = /data/mysql/mysql3306/logs/my3306_binlog
表示啟用binlog功能,并指定路徑名稱
-
sync_binlog = 1
sync_binlog選項控制mysql怎麼重新整理二進制日志到磁盤,在MySQL5.7.7後,
- 預設為1:表示采用同步寫磁盤的方式來寫二進制日志。
- 為0時:表示禁用MySQL伺服器将日志同步寫磁盤,相反,而是依賴于作業系統不時地将二進制日志重新整理到磁盤。
- 為N時:除了0與1之外的值,表示在送出N個事務後,binlog日志将同步到磁盤。
-
binlog_cache_size = 4M
使用事務表存儲引擎(如innodb存儲引擎)時,所有未送出的binlog日志會被記錄到一個緩存中去,
等事務送出時再将緩存中的binlog寫入到binlog檔案中。緩存的大小由binlog_cache_size決定,預設大小為32K。
-
max_binlog_cache_size = 2G
表示的是binlog 能夠使用的最大cache 記憶體大小
當我們執行多語句事務的時候 所有session的使用的記憶體超過max_binlog_cache_size的值時
就會報錯:“Multi-statement transaction required more than ‘max_binlog_cache_size’ bytes ofstorage”
-
max_binlog_size = 1G
指定單個binlog檔案最大值。預設值為1g,最大值1g,如果超過該值,則産生新的binlog檔案,字尾名+1,并記錄到.index檔案。
-
binlog_rows_query_log_events = 1
預設為不啟用,啟用binlog_rows_query_log_events時,會在binlog日志中記錄原始SQL語句。
-
binlog_format = row
記錄binlog的格式。[statement,row,mixed],在MySQL5.7.7之後,預設為row。
-
binlog_checksum = 1
表示啟用,該參數目的就是寫入binlog進行校驗,有兩個值[crc32|none],預設為crc32
-
expire_logs_days = 7
表示binlog檔案自動删除N天前的檔案。預設值為0,表示不自動删除,最大值99。
-
log_slave_updates= 1
從主伺服器接收的更新是否應記錄到從屬伺服器的二進制日志中。 預設值為0,表示不開啟。一般應用在master=>slave=>slave架構
-
master_info_repository = TABLE
确定slave端是否将master狀态和連接配接資訊記錄到FILE(master.info)或TABLE(mysql.slave_master_info)中,預設是FILE,建議調整為TABLE。
-
relay_log_info_repository = TABLE
表示slave 日志中salve 位置寫入TABLE中(mysql.slave_relay_log_info)
-
gtid_mode = on
啟用基于GTID的日志記錄以及日志可包含的事務類型
-
enforce_gtid_consistency = 1
伺服器通過僅允許執行可使用GTID安全記錄的語句來強制執行GTID一緻性。 在啟用基于GTID的複制之前,必須将此變量設定為ON。
-
relay_log_recovery = 1
當slave從庫當機後,假如relay-log損壞了,導緻一部分中繼日志沒有處理,則自動放棄所有未執行的relay-log,并且重新從master上擷取日志,這樣就保證了relay-log的完整性。
預設情況下該功能是關閉的,将relay_log_recovery的值設定為 1時,可在slave從庫上開啟該功能,建議開啟
-
relay-log-purge = 1
啟用自動清除中繼日志檔案。 預設值為1(ON)。
-
key_buffer_size = 32M
用于MyISAM存儲引擎表,緩存MyISAM存儲
-
read_buffer_size = 8M
表順序掃描的緩存,隻能應用于MyISAM表存儲引擎。
-
read_rnd_buffer_size = 4M
此變量用于從MyISAM表讀取,對于任何其他存儲引擎,用于多範圍讀取優化。
-
bulk_insert_buffer_size = 64M
用于myisam引擎,用一個特别的類似的樹形結構體緩存,用于提高
寫資料到非空表的情景insert select insert…values(…)(….)以及load data
-
myisam_sort_buffer_size = 128M
在REPAIR TABLE期間排序MyISAM索引時或使用CREATE INDEX或ALTER TABLE建立索引時配置設定的緩沖區大小。
-
myisam_max_sort_file_size = 10G
允許MySQL在重新建立MyISAM索引時使用的臨時檔案的最大大小(在
期間)。REPAIR TABLE,ALTER TABLE或LOAD DATA INFILE
-
myisam_repair_threads = 1
如果此值大于1,則在修複排序過程期間并行建立MyISAM表索引(每個索引在其自己的線程中)。 預設值為1。
-
lock_wait_timeout = 3600
表示嘗試擷取中繼資料鎖的逾時(以秒為機關)
包括對表,視圖,存儲過程和存儲函數的DML和DDL操作,以及LOCK TABLES,FLUSH TABLES WITH READ LOCK和HANDLER語句。
-
explicit_defaults_for_timestamp = 1
此系統變量确定伺服器是否為TIMESTAMP列中的預設值和NULL值處理啟用某些非标準行為。 預設情況下,将禁用explicit_defaults_for_timestamp,進而啟用非标準行為。
-
innodb_thread_concurrency = 0
同一時刻能夠進入innodb層次并發執行的線程數(注意是并發不是并行),如果超過CPU核數,某些線程可能處于就緒态而沒有獲得CPU時間輪片,如果SERVER層的線程大于這個值,對不起多餘的
線程将會被放到一個叫做wait queue的隊列中,而不能進入INNODB層次,進不到innodb層當然也就不能幹活了,談不上獲得CPU。
既然是一個隊列那麼它必然滿足先進入先出的原則。這也是前面說的長痛不如短痛,與其讓你不斷的進行上文切換還不如把你處于睡眠态放棄CPU使用權,預設這個值是0,代表不限制。
-
innodb_sync_spin_loops = 100
線上程挂起之前線程等待InnoDB互斥鎖被釋放的次數。
-
innodb_spin_wait_delay = 30
為了防止自旋鎖循環過快,耗費CPU。作用是控制輪詢間隔,也就是說在每次輪詢的過程中,會休息一會兒然後再輪詢。
-
transaction_isolation = REPEATABLE-READ
事物的隔離級别
-
#innodb_additional_mem_pool_size = 16M
用來儲存資料字典資訊和其他内部資料結構的記憶體池大小。在MySQL5.7.4中删除。
-
innodb_buffer_pool_size = 2560M
緩存InnoDB表資料、索引、插入緩沖、資料字典等資訊。innodb_buffer_pool_size必須是
innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances
的倍數,
如果不是将自動調整為
的倍數innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances
-
innodb_buffer_pool_instances = 4
表示InnoDB緩沖區可以被劃分為4個執行個體,提高并發性,避免在高并發環境下,出現記憶體争用問題。
需innodb_buffer_pool_size大于1G時,才會有效。
-
innodb_buffer_pool_load_at_startup = 1
指定在MySQL伺服器啟動時,InnoDB緩沖池通過加載之前儲存的相同頁面自動預熱。 通常與innodb_buffer_pool_dump_at_shutdown結合使用。
在MySQL 5.7.7後預設啟用。
-
innodb_buffer_pool_dump_at_shutdown = 1
指定在MySQL伺服器關閉時是否記錄在InnoDB緩沖池中緩存的頁面,以便在下次重新啟動時縮短預熱過程。 通常與innodb_buffer_pool_load_at_startup結合使用。
在MySQL 5.7.7後預設啟用。
-
innodb_buffer_pool_dump_pct = 25
選項定義要轉儲的最近使用的緩沖池頁面的百分比。在MySQL 5.7.7後預設為25%
-
定義InnoDB系統表空間資料檔案的名稱,大小和屬性innodb_data_file_path = ibdata1:1G;ibdata2:10M:autoextend
- innodb_flush_log_at_trx_commit = 1
-
預設值為1
表示每次事務送出時,都會觸發redo log thread 将日志緩沖中的資料寫入檔案,并‘flush’到磁盤。
-
設定為0時
表示每秒會将redo log buffer中的資料寫入redo log檔案,同時把資料刷入到磁盤中。
-
設定為2時
表示每次事務送出時,會把redo log buffer中的資料寫入redo log檔案,每秒把資料刷入到磁盤中。
-
-
innodb_log_buffer_size = 32M
InnoDB用于寫入磁盤上日志檔案的緩沖區大小(以位元組為機關)。
-
innodb_log_file_size = 2G
日志組中每個日志檔案的大小(以位元組為機關)
-
innodb_log_files_in_group = 2
表示日志組中有2個日志檔案。
-
innodb_max_undo_log_size = 4G
表示undo表空間最大大小,如果超過此值,則可以啟用innodb_undo_log_truncate來自動truncate undo表空間。
-
innodb_undo_directory = undolog
指定undo表空間位置。如果為指定,預設是在MySQL資料目錄中建立。
-
innodb_undo_tablespaces = 95
定義undo表空間的數量。
-
innodb_undo_logs = 128
定義InnoDB使用的復原段數。
-
innodb_io_capacity = 4000
設定InnoDB背景任務每秒執行的I/ 、O操作數的上限,例如從緩沖池重新整理頁面和合并來自change buffer的資料。
innodb_io_capacity限制是所有緩沖池執行個體的總限制。重新整理髒頁時,限制在緩沖池執行個體之間平均配置設定。
-
innodb_io_capacity_max = 8000
定義了InnoDB背景任務在這種情況下每秒執行的I/O操作數的上限。
-
innodb_flush_neighbors = 0
指定從InnoDB緩沖池重新整理頁面是否也重新整理同一extent内的其他髒頁。
- 預設值1,從緩沖池中重新整理同一extent内的連續髒頁。
- 設定為0,會關閉innodb_flush_neighbors,并且不會從緩沖池中重新整理其他髒頁。
- 設定為2,會從緩沖池中重新整理同一extent内的髒頁。
-
innodb_write_io_threads = 8
是資料庫的寫請求線程。預設值為4個.
-
innodb_read_io_threads = 8
是資料庫的讀請求線程。預設值為4個
-
innodb_purge_threads = 4
負責删除無用的undo頁。由于進行DML語句的操作都會生成undo,系統需要定期對undo進行清理,
這時就需要purge操作。在MySQL5.7.8後,預設線程個數為4,最大為32
-
innodb_page_cleaners = 4
負責髒頁重新整理的線程。在MySQL5.7.8後,預設線程個數為4,最大為32
-
innodb_open_files = 65535
指定MySQL可以一次保持打開的最大.ibd檔案數。
-
innodb_max_dirty_pages_pct = 50
指buffer pool中髒頁所占的百分比,達到設定的值,就會觸發髒頁的重新整理。預設為75
-
innodb_flush_method = O_DIRECT
用于将資料重新整理到InnoDB資料檔案和日志檔案的方法,這可能會影響I/O吞吐量。
-
innodb_lru_scan_depth = 4000
在更改緩沖池執行個體的數量時,請考慮調整innodb_lru_scan_depth,因為
定義頁清除程式線程每秒執行的工作量。innodb_lru_scan_depth * innodb_buffer_pool_instances
-
innodb_checksum_algorithm = crc32
指定如何生成和驗證存儲在InnoDB表空間的磁盤塊中的校驗和。 crc32是MySQL 5.7.7的預設值。
-
innodb_lock_wait_timeout = 10
InnoDB事務等待行鎖定的時間長度(以秒為機關)
-
innodb_rollback_on_timeout = 1
預設情況下,InnoDB僅復原事務逾時的最後一個語句。 如果指定了
,則事務逾時會導緻InnoDB中止并復原整個事務。--innodb_rollback_on_timeout
-
innodb_print_all_deadlocks = 1
啟用此選項後,有關InnoDB使用者事務中所有死鎖的資訊将記錄在mysqld錯誤日志中
-
innodb_file_per_table = 1
當啟用innodb_file_per_table(預設值)時,InnoDB将每個新建立的表的資料和索引存儲在單獨的.ibd檔案中,而不是系統表空間中。 删除或截斷表時,将回收這些表的存儲。
-
innodb_online_alter_log_max_size = 4G
指定InnoDB表的線上DDL操作期間使用的臨時日志檔案大小的上限(以位元組為機關)。
每個正在建立的索引或要更改的表都有一個這樣的日志檔案。 此日志檔案存儲在DDL操作期間在表中插入,更新或删除的資料。
臨時日志檔案在需要時由innodb_sort_buffer_size的值擴充,最大為innodb_online_alter_log_max_size指定的最大值。
如果臨時日志檔案超出大小上限,則ALTER TABLE操作将失敗,并且将復原所有未送出的并發DML操作。
-
internal_tmp_disk_storage_engine = InnoDB
磁盤内部臨時表的存儲引擎
-
innodb_stats_on_metadata = 0
禁用時,InnoDB不會在(如SHOW TABLE STATUS)或通路INFORMATION_SCHEMA.TABLES或INFORMATION_SCHEMA.STATISTICS)操作期間更新統計資訊。
保留禁用的設定可以提高具有大量表或索引的模式的通路速度。它還可以提高涉及InnoDB表的查詢的執行計劃的穩定性。
-
innodb_checksums = 1
InnoDB可以對從磁盤讀取的所有表空間頁面使用校驗和驗證,以確定對硬體故障或損壞的資料檔案具有額外的容錯能力。 預設情況下啟用此驗證。
-
query_cache_size = 0
查詢緩存相關參數,建議關閉。預設是關閉
-
query_cache_type = 0
查詢緩存相關參數,建議關閉。預設是關閉
-
innodb_status_file = 1
啟用InnoDB的status file,便于管理者檢視以及監控等
- innodb_status_output = 0
-
innodb_status_output_locks = 0
注意: 開啟 innodb_status_output & innodb_status_output_locks 後, 可能會導緻log-error檔案增長較快
-
performance_schema = 1
表示啟用performance schema
-
performance_schema_instrument = ‘%=on’
打開所有指定。
- innodb_monitor_enable=”module_innodb”
- innodb_monitor_enable=”module_server”
- innodb_monitor_enable=”module_dml”
- innodb_monitor_enable=”module_ddl”
- innodb_monitor_enable=”module_trx”
- innodb_monitor_enable=”module_os”
- innodb_monitor_enable=”module_purge”
- innodb_monitor_enable=”module_log”
- innodb_monitor_enable=”module_lock”
- innodb_monitor_enable=”module_buffer”
- innodb_monitor_enable=”module_index”
- innodb_monitor_enable=”module_ibuf_system”
- innodb_monitor_enable=”module_buffer_page”
-
innodb_monitor_enable=”module_adaptive_hash”
innodb 監控設定
-
[mysqldump]
針對mysqldump 資料庫備份程式的參數
-
quick
該選項用于轉儲大的表。它強制mysqldump從伺服器一次一行地檢索表中的行而不是檢索所有行并在輸出前将它緩存到記憶體中。
-
max_allowed_packet = 32M
限制server接受的資料包的大小。如果寫入大資料時,因為預設的配置太小,
插入和更新操作會因為 max_allowed_packet 參數限制,而導緻失敗。
預設值4MB
2. 錯誤日志
錯誤日志檔案對MySQL的啟動、運作、關閉過程進行了記錄。
下面示例是一個根據錯誤日志來處理步驟。
示例準備
在MySQL資料目錄手動建立mydir目錄,并更改為屬主為mysql
# cd /data/mysql/mysql3306/data
# mkdir mydir
# chown mysql:mysql
登陸mysql,使用指令show databases可以看到mydir。
[email protected] [information_schema] ::> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| employees |
| info |
| move_db |
| mysql |
| mysql3306_data |
| performance_schema |
| sakila |
| sbtest |
| sys |
| test |
| undolog |
| mydir |
+--------------------+
rows in set ( sec)
在mydir資料庫中,建立表t1
mysql> use mydir
mysql> create table t1(c1 int);
删除datadir中的mydir目錄
# cd /data/mysql/mysql3306/data
# rm -rf mydir
重新開機MySQL
根據錯誤日志,來處理資料庫錯誤
檢視error log日志
mysql> select @@log_error;
+---------------------------------+
| @@log_error |
+---------------------------------+
| /data/mysql/mysql3306/error.log |
+---------------------------------+
# tail -f /data/mysql/mysql3306/error.log
--T13::Z [ERROR] InnoDB: Operating system error number in a file operation.
--T13::Z [ERROR] InnoDB: The error means the system cannot find the path specified.
--T13::Z [ERROR] InnoDB: If you are installing InnoDB, remember that you must create directories yourself, InnoDB does not create them.
--T13::Z [ERROR] InnoDB: Cannot open datafile for read-only: './mydir/t1.ibd' OS error:
--T13::Z [ERROR] InnoDB: Operating system error number in a file operation.
--T13::Z [ERROR] InnoDB: The error means the system cannot find the path specified.
--T13::Z [ERROR] InnoDB: If you are installing InnoDB, remember that you must create directories yourself, InnoDB does not create them.
--T13::Z [ERROR] InnoDB: Could not find a valid tablespace file for `mydir/t1`. Please refer to http://dev.mysql.com/doc/refman//en/innodb-troubleshooting-datadict.html for how to resolve the issue.
錯誤日志中提示找不到/mydir/t1.ibd 表,mydir目錄不存在了。
[email protected] [(none)] ::> SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE '%t1%';
+----------+-----------------+------+--------+-------+-------------+------------+---------------+------------+
| TABLE_ID | NAME | FLAG | N_COLS | SPACE | FILE_FORMAT | ROW_FORMAT | ZIP_PAGE_SIZE | SPACE_TYPE |
+----------+-----------------+------+--------+-------+-------------+------------+---------------+------------+
| | mydir/t1 | | | | Barracuda | Dynamic | | Single |
| | sbtest/sbtest1 | | | | Barracuda | Dynamic | | Single |
| | sbtest/sbtest10 | | | | Barracuda | Dynamic | | Single |
| | test/t11 | | | | Barracuda | Dynamic | | Single |
| | test/t12 | | | | Barracuda | Dynamic | | Single |
+----------+-----------------+------+--------+-------+-------------+------------+---------------+------------+
rows in set ( sec)
檢視mydir的表結構
mysql> SELECT a.NAME,
-> b.name AS col_name,
-> CASE
-> WHEN b.MTYPE = THEN 'VARCHAR'
-> WHEN b.MTYPE = THEN 'CHAR'
-> WHEN b.MTYPE = THEN 'FIXBINARY'
-> WHEN b.MTYPE = THEN 'BINARY'
-> WHEN b.MTYPE = THEN 'BLOB'
-> WHEN b.MTYPE = THEN 'int'
-> WHEN b.MTYPE = THEN 'SYS_CHILD'
-> WHEN b.MTYPE = THEN 'SYS'
-> WHEN b.MTYPE = THEN 'FLOAT'
-> WHEN b.MTYPE = THEN 'DOUBLE'
-> WHEN b.MTYPE = THEN 'DECIMAL'
-> WHEN b.MTYPE = THEN 'VARMYSQL'
-> WHEN b.MTYPE = THEN 'MYSQL'
-> WHEN b.MTYPE = THEN 'GEOMETRY'
-> ELSE MTYPE
-> END
-> AS Type
-> FROM INNODB_SYS_TABLES a
-> JOIN INNODB_SYS_COLUMNS b ON a.TABLE_ID = b.TABLE_ID
-> WHERE a.NAME = 'mydir/t1';
+----------+----------+------+
| NAME | col_name | Type |
+----------+----------+------+
| mydir/t1 | c1 | int |
+----------+----------+------+
row in set ( sec)
在test庫中,建立同樣表結構的t1表。
mysql> create table t1(c1 int);
在datadir目錄建立mydir目錄,并且把test目錄中的t1.frm複制到mydir目錄中
# mkdir /data/mysql/mysql3306/data/mydir
# cp /data/mysql/mysql3306/data/test/t1.frm /data/mysql/mysql3306/data/mydir
# chown -R mysql:mysql /data/mysql/mysql3306/data/mydir
删除mydir資料庫
mysql> drop database mydir;
重新查詢
mysql> SELECT a.NAME,
-> b.name AS col_name,
-> CASE
-> WHEN b.MTYPE = THEN 'VARCHAR'
-> WHEN b.MTYPE = THEN 'CHAR'
-> WHEN b.MTYPE = THEN 'FIXBINARY'
-> WHEN b.MTYPE = THEN 'BINARY'
-> WHEN b.MTYPE = THEN 'BLOB'
-> WHEN b.MTYPE = THEN 'int'
-> WHEN b.MTYPE = THEN 'SYS_CHILD'
-> WHEN b.MTYPE = THEN 'SYS'
-> WHEN b.MTYPE = THEN 'FLOAT'
-> WHEN b.MTYPE = THEN 'DOUBLE'
-> WHEN b.MTYPE = THEN 'DECIMAL'
-> WHEN b.MTYPE = THEN 'VARMYSQL'
-> WHEN b.MTYPE = THEN 'MYSQL'
-> WHEN b.MTYPE = THEN 'GEOMETRY'
-> ELSE MTYPE
-> END
-> AS Type
-> FROM INNODB_SYS_TABLES a
-> JOIN INNODB_SYS_COLUMNS b ON a.TABLE_ID = b.TABLE_ID
-> WHERE a.NAME = 'mydir/t1';
Empty set ( sec)
重新開機資料庫,觀察錯誤日志,已沒有此前的錯誤。
# mysqladmin -S /tmp/mysql3306.sock shutdown
# tail -f error.log
--T14::Z [Note] --secure-file-priv is set to NULL. Operations related to importing and exporting data are disabled
--T14::Z [Note] mysqld (mysqld -log) starting as process ...
--T14::Z [Note] InnoDB: PUNCH HOLE support available
--T14::Z [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
--T14::Z [Note] InnoDB: Uses event mutexes
--T14::Z [Note] InnoDB: GCC builtin __sync_synchronize() is used for memory barrier
--T14::Z [Note] InnoDB: Compressed tables use zlib
--T14::Z [Note] InnoDB: Using Linux native AIO
--T14::Z [Note] InnoDB: Number of pools:
--T14::Z [Note] InnoDB: Using CPU crc32 instructions
--T14::Z [Note] InnoDB: Initializing buffer pool, total size = G, instances = , chunk size = M
--T14::Z [Note] InnoDB: Completed initialization of buffer pool
--T14::Z [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().
--T14::Z [Note] InnoDB: Opened undo tablespaces
--T14::Z [Note] InnoDB: undo tablespaces made active
--T14::Z [Note] InnoDB: Highest supported file format is Barracuda.
--T14::Z [Note] InnoDB: Creating shared tablespace for temporary tables
--T14::Z [Note] InnoDB: Setting file './ibtmp1' size to MB. Physically writing the file full; Please wait ...
--T14::Z [Note] InnoDB: File './ibtmp1' size is now MB.
--T14::Z [Note] InnoDB: redo rollback segment(s) found. redo rollback segment(s) are active.
--T14::Z [Note] InnoDB: non-redo rollback segment(s) are active.
--T14::Z [Note] InnoDB: Waiting for purge to start
--T14::Z [Note] InnoDB: started; log sequence number
--T14::Z [Note] InnoDB: Loading buffer pool(s) from /data/mysql/mysql3306/data/ib_buffer_pool
--T14::Z [Note] Plugin 'FEDERATED' is disabled.
--T14::Z [Warning] Failed to set up SSL because of the following SSL library error: SSL context is not usable without certificate and private key
--T14::Z [Note] Server hostname (bind-address): '*'; port:
--T14::Z [Note] IPv6 is available.
--T14::Z [Note] - '::' resolves to '::';
--T14::Z [Note] Server socket created on IP: '::'.
--T14::Z [Note] Event Scheduler: Loaded events
--T14::Z [Note] mysqld: ready for connections.
Version: '-log' socket: '/tmp/mysql3306.sock' port: MySQL Community Server (GPL)
--T14::Z [Note] InnoDB: Buffer pool(s) load completed at ::
3. 二進制日志檔案
binlog記錄了對MySQL資料庫執行更改的所有操作,但是不包括SELECT和SHOW這類操作,因為這類操作對資料本身并沒有修改。然後,若操作本身并沒有導緻資料庫發生變化,那麼該操作也會寫入二進制日志,詳細資訊請參考博文MySQL redo log 與 binlog 的差別
二進制日志的主要作用:
- 1)可以完成主從複制。在主伺服器上把所有修改資料的操作記錄到binlog中,通過網絡發送給從伺服器,進而達到主從同步。
- 2)進行恢複操作。資料可以通過binlog日志,使用mysqlbinlog指令,實作基于時間點和位置的恢複操作。
3.1 資料庫 gtid_mode=ON
gtid_mode=ON
利用二進制日志可以實作基于時間與位置的恢複,例如由于誤操作删除了一張表,這時候完全恢複是沒用的,因為日志裡面還是存在錯誤語句,我們需要的是恢複到誤操作之前的狀态,然後跳過誤操作資料,再恢複後面操作語句。
3.1.1 建立表pitr,并插入兩條資料。
mysql> select @@gtid_mode;
+-------------+
| @@gtid_mode |
+-------------+
| ON |
+-------------+
1 row in set (0.00 sec)
mysql> use test;
Database changed
mysql> create table pitr(name varchar(30), birthday timestamp);
Query OK, 0 rows affected (0.07 sec)
mysql> insert into pitr values('張三',sysdate());
Query OK, 1 row affected (0.02 sec)
mysql> insert into pitr values('李四',sysdate());
Query OK, 1 row affected (0.02 sec)
mysql> select * from pitr;
+--------+---------------------+
| name | birthday |
+--------+---------------------+
| 張三 | 2018-08-27 13:00:05 |
| 李四 | 2018-08-27 13:00:14 |
+--------+---------------------+
2 rows in set (0.00 sec)
3.1.2 誤删除資料
誤删除資料’李四’,并插入資料’王五’,删除表pitr
mysql> delete from pitr where name='李四';
Query OK, 1 row affected (0.01 sec)
mysql> insert into pitr values('王五',sysdate());
Query OK, 1 row affected (0.01 sec)
mysql> select * from pitr;
+--------+---------------------+
| name | birthday |
+--------+---------------------+
| 張三 | 2018-08-27 13:00:05 |
| 王五 | 2018-08-27 13:00:55 |
+--------+---------------------+
2 rows in set (0.00 sec)
3.1.3 利用mysqlbinlog檢視binlog
mysql> show master status;
+----------------------+----------+--------------+------------------+-------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------------------------------+
| my3306_binlog | | | | e4382832-d--ba-:- |
+----------------------+----------+--------------+------------------+-------------------------------------------+
row in set ( sec)
mysql> show binlog events in 'my3306_binlog.000002';
+----------------------+------+----------------+-----------+-------------+---------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+----------------------+------+----------------+-----------+-------------+---------------------------------------------------------------------+
| my3306_binlog | | Format_desc | | | Server ver: -log, Binlog ver: |
| my3306_binlog | | Previous_gtids | | | e4382832-d--ba-:- |
| my3306_binlog | | Gtid | | | SET @@SESSION.GTID_NEXT= 'e4382832-949d-11e8-97ba-080027793430:5' |
| my3306_binlog | | Query | | | use `test`; create table pitr(name varchar(), birthday timestamp) |
| my3306_binlog | | Gtid | | | SET @@SESSION.GTID_NEXT= 'e4382832-949d-11e8-97ba-080027793430:6' |
| my3306_binlog | | Query | | | BEGIN |
| my3306_binlog | | Rows_query | | | # insert into pitr values('張三',sysdate()) |
| my3306_binlog | | Table_map | | | table_id: (test.pitr) |
| my3306_binlog | | Write_rows | | | table_id: flags: STMT_END_F |
| my3306_binlog | | Xid | | | COMMIT /* xid=612 */ |
| my3306_binlog | | Gtid | | | SET @@SESSION.GTID_NEXT= 'e4382832-949d-11e8-97ba-080027793430:7' |
| my3306_binlog | | Query | | | BEGIN |
| my3306_binlog | | Rows_query | | | # insert into pitr values('李四',sysdate()) |
| my3306_binlog | | Table_map | | | table_id: (test.pitr) |
| my3306_binlog | | Write_rows | | | table_id: flags: STMT_END_F |
| my3306_binlog | | Xid | | | COMMIT /* xid=613 */ |
| my3306_binlog | | Gtid | | | SET @@SESSION.GTID_NEXT= 'e4382832-949d-11e8-97ba-080027793430:8' |
| my3306_binlog | | Query | | | BEGIN |
| my3306_binlog | | Rows_query | | | # delete from pitr where name='李四' |
| my3306_binlog | | Table_map | | | table_id: (test.pitr) |
| my3306_binlog | | Delete_rows | | | table_id: flags: STMT_END_F |
| my3306_binlog | | Xid | | | COMMIT /* xid=615 */ |
| my3306_binlog | | Gtid | | | SET @@SESSION.GTID_NEXT= 'e4382832-949d-11e8-97ba-080027793430:9' |
| my3306_binlog | | Query | | | BEGIN |
| my3306_binlog | | Rows_query | | | # insert into pitr values('王五',sysdate()) |
| my3306_binlog | | Table_map | | | table_id: (test.pitr) |
| my3306_binlog | | Write_rows | | | table_id: flags: STMT_END_F |
| my3306_binlog | | Xid | | | COMMIT /* xid=616 */ |
| my3306_binlog | | Gtid | | | SET @@SESSION.GTID_NEXT= 'e4382832-949d-11e8-97ba-080027793430:10' |
| my3306_binlog | | Query | | | use `test`; DROP TABLE `pitr` /* generated by server */ |
+----------------------+------+----------------+-----------+-------------+---------------------------------------------------------------------+
rows in set ( sec)
# mysqlbinlog --no-defaults -vv --base64-output=decode-rows my3306_binlog.000001
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#180827 12:54:21 server id 1003306 end_log_pos 123 CRC32 0xd97051b3 Start: binlog v 4, server v 5.7.23-log created 180827 12:54:21 at startup
ROLLBACK/*!*/;
# at 123
#180827 12:54:21 server id 1003306 end_log_pos 154 CRC32 0x440442c1 Previous-GTIDs
# [empty]
# at 154
#180827 12:13:03 server id 1003306 end_log_pos 219 CRC32 0xd7a0969e GTID last_committed=0 sequence_number=1 rbr_only=no
SET @@SESSION.GTID_NEXT= 'e4382832-949d-11e8-97ba-080027793430:1'/*!*/;
# at 219
#180827 12:13:03 server id 1003306 end_log_pos 349 CRC32 0x21f3f0ef Query thread_id=21 exec_time=2491 error_code=0
use `test`/*!*/;
SET TIMESTAMP=/*!*/;
SET @@session.pseudo_thread_id=/*!*/;
SET @@session.foreign_key_checks=, @@session.sql_auto_is_null=, @@session.unique_checks=, @@session.autocommit=/*!*/;
SET @@session.sql_mode=/*!*/;
SET @@session.auto_increment_increment=, @@session.auto_increment_offset=/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=,@@session.collation_connection=,@@session.collation_server=/*!*/;
SET @@session.lc_time_names=/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
SET @@session.explicit_defaults_for_timestamp=/*!*/;
create table pitr(name varchar(),birthday timestamp)
/*!*/;
# at 349
#180827 12:13:40 server id 1003306 end_log_pos 414 CRC32 0x7b818eb7 GTID last_committed=1 sequence_number=2 rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'e4382832-949d-11e8-97ba-080027793430:2'/*!*/;
# at 414
#180827 12:13:40 server id 1003306 end_log_pos 486 CRC32 0x79a2e77e Query thread_id=21 exec_time=2454 error_code=0
SET TIMESTAMP=/*!*/;
SET @@session.sql_mode=/*!*/;
BEGIN
/*!*/;
# at 486
#180827 12:13:40 server id 1003306 end_log_pos 654 CRC32 0xbcf69674 Rows_query
# BINLOG '
# dHqDWxMqTw8AMwAAAGUCAAAAAHgAAAAAAAEABHRlc3QABHBpdHIAAg8RA1AAAAMDbVoa
# dHqDWx4qTw8ALwAAAJQCAAAAAHgAAAAAAAEAAgAC//wG5byg5LiJW4N6dC294eg=
# '
# at 654
#180827 12:13:40 server id 1003306 end_log_pos 705 CRC32 0x344b2cd9 Table_map: `test`.`pitr` mapped to number 121
# at 705
#180827 12:13:40 server id 1003306 end_log_pos 752 CRC32 0x615eda67 Write_rows: table id 121 flags: STMT_END_F
### INSERT INTO `test`.`pitr`
### SET
### @1='張三' /* VARSTRING(80) meta=80 nullable=1 is_null=0 */
### @2=1535343220 /* TIMESTAMP(0) meta=0 nullable=1 is_null=0 */
# at 752
#180827 12:13:40 server id 1003306 end_log_pos 783 CRC32 0xdb27b4f0 Xid = 587
COMMIT/*!*/;
# at 783
#180827 12:13:46 server id 1003306 end_log_pos 848 CRC32 0x68107e14 GTID last_committed=2 sequence_number=3 rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'e4382832-949d-11e8-97ba-080027793430:3'/*!*/;
# at 848
#180827 12:13:46 server id 1003306 end_log_pos 920 CRC32 0x23c1438e Query thread_id=21 exec_time=2448 error_code=0
SET TIMESTAMP=/*!*/;
BEGIN
/*!*/;
# at 920
#180827 12:13:46 server id 1003306 end_log_pos 1088 CRC32 0x8d9184ed Rows_query
# BINLOG '
# enqDWxMqTw8AMwAAALsDAAAAAHgAAAAAAAEABHRlc3QABHBpdHIAAg8RA1AAAAN2SiQc
# enqDWx4qTw8ALwAAAOoDAAAAAHgAAAAAAAEAAgAC//wG5p2O5ZubW4N6ennHpOc=
# '
# at 1088
#180827 12:13:46 server id 1003306 end_log_pos 1139 CRC32 0x02366796 Table_map: `test`.`pitr` mapped to number 121
# at 1139
#180827 12:13:46 server id 1003306 end_log_pos 1186 CRC32 0xb45043ab Write_rows: table id 121 flags: STMT_END_F
### INSERT INTO `test`.`pitr`
### SET
### @1='李四' /* VARSTRING(80) meta=80 nullable=1 is_null=0 */
### @2=1535343226 /* TIMESTAMP(0) meta=0 nullable=1 is_null=0 */
# at 1186
#180827 12:13:46 server id 1003306 end_log_pos 1217 CRC32 0xb22a5e76 Xid = 594
COMMIT/*!*/;
# at 1217
#180827 12:59:26 server id 1003306 end_log_pos 1282 CRC32 0x205f1806 GTID last_committed=3 sequence_number=4 rbr_only=no
SET @@SESSION.GTID_NEXT= 'e4382832-949d-11e8-97ba-080027793430:4'/*!*/;
# at 1282
#180827 12:59:26 server id 1003306 end_log_pos 1399 CRC32 0x852c531f Query thread_id=27 exec_time=0 error_code=0
SET TIMESTAMP=/*!*/;
SET @@session.sql_mode=/*!*/;
DROP TABLE `pitr` /* generated by server */
/*!*/;
# at 1399
#180827 12:59:31 server id 1003306 end_log_pos 1450 CRC32 0x8d409e4b Rotate to my3306_binlog.000002 pos: 4
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET [email protected]_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
3.1.4 基于位置恢複
恢複pitr表中三條資料。
# mysqlbinlog --no-defaults --stop-position='1072' /data/mysql/mysql3306/logs/my3306_binlog.000002 | mysql -S /tmp/mysql3306.sock
# mysqlbinlog --no-defaults --start-position='1398' --stop-position='1739' /data/mysql/mysql3306/logs/my3306_binlog.000002 | mysql -S /tmp/mysql3306.sock
mysql> use test;
Database changed
mysql> select * from pitr;
ERROR 1146 (42S02): Table 'test.pitr' doesn't exist
并沒有恢複。。。
是不是缺了什麼步驟,理下思路,是不是binlog裡的gtid小于目前的gtid,然後恢複的時候就跳過了。
為了确認自己想法的正确性,動手操作吧。
1. 備份目前binlog
# cp my3306_binlog.000002 ../
2. 重置gtid
mysql> reset master;
Query OK, 0 rows affected (0.05 sec)
3. 重新恢複
# mysqlbinlog --no-defaults --stop-position='1072' /data/mysql/mysql3306/my3306_binlog.000002 | mysql -S /tmp/mysql3306.sock
# mysqlbinlog --no-defaults --start-position='1398' --stop-position='1739' /data/mysql/mysql3306/my3306_binlog.000002 | mysql -S /tmp/mysql3306.sock
4. 重新查詢
mysql> select * from pitr;
+--------+---------------------+
| name | birthday |
+--------+---------------------+
| 張三 | 2018-08-27 13:00:05 |
| 李四 | 2018-08-27 13:00:14 |
| 王五 | 2018-08-27 13:00:55 |
+--------+---------------------+
3 rows in set (0.00 sec)
恢複成功
下面嘗試變更gtid模式能不能恢複
) ON 模式(新的和複制的事務都必須是GTID事務。)
)ON_PERMISSIVE 模式(新事務是GTID事務,複制事務可以是GTID也可以不是GTID事務)
[email protected] [test] ::> set global gtid_mode ='ON_PERMISSIVE';
Query OK, rows affected ( sec)
# mysqlbinlog --no-defaults --stop-position='1072' /data/mysql/mysql3306/my3306_binlog.000002 | mysql -S /tmp/mysql3306.sock
# mysqlbinlog --no-defaults --start-position='1398' --stop-position='1739' /data/mysql/mysql3306/my3306_binlog.000002 | mysql -S /tmp/mysql3306.sock
[email protected] [test] ::> select * from pitr;
ERROR (S02): Table 'test.pitr' doesn't exist
)OFF_PERMISSIVE 模式(新事務不是GTID事務,複制事務可以是GTID也可以不是GTID事務)
[email protected] [test] ::> set global gtid_mode = 'OFF_PERMISSIVE';
# mysqlbinlog --no-defaults --stop-position='1072' /data/mysql/mysql3306/my3306_binlog.000002 | mysql -S /tmp/mysql3306.sock
# mysqlbinlog --no-defaults --start-position='1398' --stop-position='1739' /data/mysql/mysql3306/my3306_binlog.000002 | mysql -S /tmp/mysql3306.sock
[email protected] [test] ::> select * from pitr;
ERROR (S02): Table 'test.pitr' doesn't exist
) OFF模式(不産生GTID,隻接受不帶GTID的事務)
[email protected] [test] ::> set global gtid_mode ='OFF';
# mysqlbinlog --no-defaults --stop-position='1072' /data/mysql/mysql3306/my3306_binlog.000002 | mysql -S /tmp/mysql3306.sock
ERROR (HY000) at line : @@SESSION.GTID_NEXT cannot be set to UUID:NUMBER when @@GLOBAL.GTID_MODE = OFF.
[[email protected] :: /data/mysql/mysql3306/logs]
# mysqlbinlog --no-defaults --start-position='1398' --stop-position='1739' /data/mysql/mysql3306/my3306_binlog.000002 | mysql -S /tmp/mysql3306.sock
ERROR (HY000) at line : @@SESSION.GTID_NEXT cannot be set to UUID:NUMBER when @@GLOBAL.GTID_MODE = OFF.
說明不能恢複。。。
3.1.5 加上選項 --skip-gtids
【重要】
--skip-gtids
不要在輸出中顯示任何GTID。從一個或多個包含GTID的二進制日志寫入轉儲檔案時需要這樣做,如下例所示:
# mysqlbinlog --no-defaults --skip-gtids --stop-position='1106' /data/mysql/mysql3306/logs/my3306_binlog.000019 | mysql -S /tmp/mysql3306.sock
也能恢複資料。
3.2 資料庫 gtid_mode=OFF
gtid_mode=OFF
使用mysqlbinlog指令,實作基于位置的恢複操作
mysql> select @@gtid_mode;
+-------------+
| @@gtid_mode |
+-------------+
| OFF |
+-------------+
1 row in set (0.00 sec)
[email protected] [(none)] 14:06:07> use test;
Database changed
[email protected] [test] 14:06:17> create table pitr(c1 int);
Query OK, 0 rows affected (0.08 sec)
[email protected] [test] 14:06:41> insert into pitr select 1;
Query OK, 1 row affected (0.02 sec)
Records: 1 Duplicates: 0 Warnings: 0
[email protected] [test] 14:06:52> insert into pitr select 2;
Query OK, 1 row affected (0.03 sec)
Records: 1 Duplicates: 0 Warnings: 0
[email protected] [test] 14:06:55> insert into pitr select 3;
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
[email protected] [test] 14:06:58> drop table pitr;
Query OK, 0 rows affected (0.04 sec)
[email protected] [test] 14:07:05> show master status;
+----------------------+----------+--------------+------------------+----------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+----------------------------------------+
| my3306_binlog.000005 | 1452 | | | e4382832-949d-11e8-97ba-080027793430:1 |
+----------------------+----------+--------------+------------------+----------------------------------------+
1 row in set (0.00 sec)
[email protected] [test] 14:07:12> show binlog events in 'my3306_binlog.000005';
+----------------------+------+----------------+-----------+-------------+---------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+----------------------+------+----------------+-----------+-------------+---------------------------------------------------------+
| my3306_binlog.000005 | 4 | Format_desc | 1003306 | 123 | Server ver: 5.7.23-log, Binlog ver: 4 |
| my3306_binlog.000005 | 123 | Previous_gtids | 1003306 | 194 | e4382832-949d-11e8-97ba-080027793430:1 |
| my3306_binlog.000005 | 194 | Anonymous_Gtid | 1003306 | 259 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| my3306_binlog.000005 | 259 | Query | 1003306 | 358 | use `test`; create table pitr(c1 int) |
| my3306_binlog.000005 | 358 | Anonymous_Gtid | 1003306 | 423 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| my3306_binlog.000005 | 423 | Query | 1003306 | 495 | BEGIN |
| my3306_binlog.000005 | 495 | Rows_query | 1003306 | 544 | # insert into pitr select 1 |
| my3306_binlog.000005 | 544 | Table_map | 1003306 | 591 | table_id: 129 (test.pitr) |
| my3306_binlog.000005 | 591 | Write_rows | 1003306 | 631 | table_id: 129 flags: STMT_END_F |
| my3306_binlog.000005 | 631 | Xid | 1003306 | 662 | COMMIT /* xid=1066 */ |
| my3306_binlog.000005 | 662 | Anonymous_Gtid | 1003306 | 727 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| my3306_binlog.000005 | 727 | Query | 1003306 | 799 | BEGIN |
| my3306_binlog.000005 | 799 | Rows_query | 1003306 | 848 | # insert into pitr select 2 |
| my3306_binlog.000005 | 848 | Table_map | 1003306 | 895 | table_id: 129 (test.pitr) |
| my3306_binlog.000005 | 895 | Write_rows | 1003306 | 935 | table_id: 129 flags: STMT_END_F |
| my3306_binlog.000005 | 935 | Xid | 1003306 | 966 | COMMIT /* xid=1067 */ |
| my3306_binlog.000005 | 966 | Anonymous_Gtid | 1003306 | 1031 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| my3306_binlog.000005 | 1031 | Query | 1003306 | 1103 | BEGIN |
| my3306_binlog.000005 | 1103 | Rows_query | 1003306 | 1152 | # insert into pitr select 3 |
| my3306_binlog.000005 | 1152 | Table_map | 1003306 | 1199 | table_id: 129 (test.pitr) |
| my3306_binlog.000005 | 1199 | Write_rows | 1003306 | 1239 | table_id: 129 flags: STMT_END_F |
| my3306_binlog.000005 | 1239 | Xid | 1003306 | 1270 | COMMIT /* xid=1068 */ |
| my3306_binlog.000005 | 1270 | Anonymous_Gtid | 1003306 | 1335 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| my3306_binlog.000005 | 1335 | Query | 1003306 | 1452 | use `test`; DROP TABLE `pitr` /* generated by server */ |
+----------------------+------+----------------+-----------+-------------+---------------------------------------------------------+
24 rows in set (0.00 sec)
# mysqlbinlog --no-defaults --stop-position='1270' /data/mysql/mysql3306/logs/my3306_binlog.000005 | mysql -S /tmp/mysql3306.sock
[email protected] [(none)] 14:08:21> use test;
Database changed
[email protected] [test] 14:08:24> select * from pitr;
+------+
| c1 |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.00 sec)
4. 慢查詢日志
慢查詢日志可以把超過參數long_query_time時間的所有SQL語句記錄進來,幫助DBA人員優化所有問題的SQL語句。
通過mysqldumpslow工具可以檢視慢查詢日志,如:
# mysqldumpslow /data/mysql/mysql3306/slow.log
Reading mysql slow query log from /data/mysql/mysql3306/slow.log
Count: Time=s (s) Lock=s (s) Rows= (), wanbin[wanbin]@[]
SELECT *
FROM employees.dept_emp
LEFT JOIN employees.departments
ON employees.departments.dept_no = employees.dept_emp.dept_no
LEFT JOIN employees.employees
ON employees.employees.emp_no = employees.dept_emp.emp_no;
mysqld, Version: N.N.N-log (MySQL Community Server (GPL)). started with:
mysqld, Version: N.N.N-log (MySQL Community Server (GPL)). started with:
mysqld, Version: N.N.N-log (MySQL Community Server (GPL)). started with:
mysqld, Version: N.N.N-log (MySQL Community Server (GPL)). started with:
mysqld, Version: N.N.N-log (MySQL Community Server (GPL)). started with:
mysqld, Version: N.N.N-log (MySQL Community Server (GPL)). started with:
# Time: N-N-24T08:N:N.171584Z
# [email protected]: root[root] @ localhost [] Id: N
# Query_time: N.N Lock_time: N.N Rows_sent: N Rows_examined: N
SET timestamp=N;
set @idbdataindx = (select sum(data_length+index_length) from information_schema.tables where engine = 'S')
Count: Time=s (s) Lock=s (s) Rows= (), wanbin[wanbin]@[]
SELECT *
FROM employees.dept_emp
LEFT JOIN employees.departments
ON employees.departments.dept_no = employees.dept_emp.dept_no
...
如果使用者想得到執行時間最長的10條SQL
# mysqldumpslow -s al -n 10 /data/mysql/mysql3306/slow.log
Reading mysql slow query log from /data/mysql/mysql3306/slow.log
Count: 1 Time=0.18s (0s) Lock=s (s) Rows= (), root[root]@localhost
select * from schema_auto_increment_columns
Count: Time=s (s) Lock=s (s) Rows= (), root[root]@localhost
SELECT SUBSTRING_INDEX(event_name,'S',N) AS
code_area, sys.format_bytes(SUM(current_alloc))
AS current_alloc
FROM sys.x$memory_global_by_current_bytes
GROUP BY SUBSTRING_INDEX(event_name,'S',N)
ORDER BY SUM(current_alloc) DESC
...
下面介紹利用percona-toolkit工具,檢視慢查詢日志。
1)解壓percona-toolkit工具包
2)添加至環境變量中
# echo "export PATH=$PATH:/opt/percona-toolkit-3.0.11/bin" >> /etc/profile
# source /etc/profile
3)分析slowlog
# pt-query-digest /data/mysql/mysql3306/slow.log
Can't locate Data/Dumper.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /opt/percona-toolkit-3.0.11/bin/pt-query-digest line 75.
BEGIN failed--compilation aborted at /opt/percona-toolkit-/bin/pt-query-digest line
報錯提示缺少了Data/Dumper.pm 包
wget http://www.cpan.org/modules/by-module/Data/Data-Dumper-.tar.gz
# tar -xvzf Data-Dumper-.tar.gz
# cd Data-Dumper-/
# perl Makefile.PL
Can't locate ExtUtils/MakeMaker.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at Makefile.PL line 2.
BEGIN failed--compilation aborted at Makefile.PL line 2.
# yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker cpan
# make
# make install
# pt-query-digest /data/mysql/mysql3306/slow.log
Can't locate Digest/MD5.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /opt/percona-toolkit-/bin/pt-query-digest line
BEGIN failed--compilation aborted at /opt/percona-toolkit-/bin/pt-query-digest line
又提示缺包。。
# yum -y install perl-Digest-MD5
# pt-query-digest /data/mysql/mysql3306/slow.log
# ms user time, ms system time, M rss, M vsz
# Current date: Mon Aug ::
# Hostname: mysqldb1
# Files: /data/mysql/mysql3306/slow.log
# Overall: total, unique, QPS, x concurrency _____________
# Time range: --T02:: to --T14::
# Attribute total min max avg % stddev median
# ============ ======= ======= ======= ======= ======= ======= =======
# Exec time s us s ms ms ms ms
# Lock time ms ms ms ms ms us
# Rows sent M k k k
# Rows examine M k k k k
# Query size k k
# Profile
# Rank Query ID Response time Calls R/Call V/M I
# ==== ================================ ============= ===== ====== ===== =
# ... % SELECT sbtest?
# ... % SELECT sbtest?
# ... % SELECT sbtest?
# ... % SELECT sbtest?
# ... % SELECT dept_emp
# ... % SELECT employees.dept_emp employees.departments employees.employees
information_schema.tables
# ... % SELECT information_schema.innodb_buffer_page
# ... % SELECT employees.dept_emp employees.departments
# ... % SELECT innodb_buffer_stats_by_schema
# ... % SELECT INFORMATION_SCHEMA.FILES INFORMATION_SCHEMA.PARTITIONS
# ... % SELECT schema_auto_increment_columns
# ... % SELECT innodb_buffer_stats_by_table
# ... % SELECT employees
# ... % SELECT help_topic
# ... % SELECT dept_emp
# MISC xMISC % < ITEMS>
# Query : QPS, x concurrency, ID at byte
# This item is included in the report because it matches --limit.
# Scores: V/M =
# Time range: --T00:: to --T00::
# Attribute pct total min max avg % stddev median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count
# Exec time s ms ms ms ms ms ms
# Lock time ms us us us us us us
# Rows sent k
# Rows examine k
# Query size k
# String:
# Databases move_db
# Hosts localhost
# Users root
# Query_time distribution
# us
# us
# us
# ms
# ms
# ms ################################################################
# s
# s+
# Tables
# SHOW TABLE STATUS FROM `move_db` LIKE 'sbtest1'\G
# SHOW CREATE TABLE `move_db`.`sbtest1`\G
# EXPLAIN /*! PARTITIONS*/
SELECT c FROM sbtest1 WHERE id BETWEEN AND \G
5. 全量日志
general log會記錄MySQL資料庫所有操作的SQL語句,包含select和show。
預設情況下,禁用正常查詢日志。
- general log相關參數
general_log= #表示禁用general log general_log_file = file_name #表示general log的檔案名,預設以hostname.log命名 log_output 表示輸出格式,有三種方式:TABLE,FILE,NONE.預設是輸出至FILE格式
- 檢視general log
mysql> set global general_log=; Query OK, rows affected ( sec) mysql> show databases; mysql> select count(*) from employees.employees; mysql> exit # tail -100f /data/mysql/mysql3306/data/mysqldb1.log mysqld, Version: 5.7.23-log (MySQL Community Server (GPL)). started with: Tcp port: 3306 Unix socket: /tmp/mysql3306.sock Time Id Command Argument 2018-08-27T12:31:28.156713Z 5 Query show databases 2018-08-27T12:31:44.258116Z 5 Query select count(*) from employees.employees --T12::Z Quit
6. 審計日志
資料庫審計能夠實時記錄網絡上的資料庫活動,對資料庫操作進行細粒度審計的合規性管理,對資料庫遭受到的風險行為進行告警,對攻擊行為進行阻斷。
它通過對使用者通路資料庫行為的記錄、分析和彙報,用來幫助使用者事後生成合規報告,事故追根溯源,同時加強内外部資料庫網絡行為記錄,提高資料資産安全。
MySQL資料庫官方的收費元件需要購買企業版才可以使用審計功能。下面利用第三方開源審計插件完成審計工作。
下載下傳插件包
# wget https://bintray.com/mcafee/mysql-audit-plugin/download_file?file_path=audit-plugin-mysql-5.7-1.1.6-784-linux-x86_64.zip
解壓
# unzip download_file\?file_path\=audit-plugin-mysql-5.7-1.1.6-784-linux-x86_64.zip
Archive: download_file?file_path=audit-plugin-mysql----linux-x86_64.zip
creating: audit-plugin-mysql---/
creating: audit-plugin-mysql---/lib/
inflating: audit-plugin-mysql---/lib/libaudit_plugin.so
inflating: audit-plugin-mysql---/COPYING
inflating: audit-plugin-mysql---/THIRDPARTY.txt
inflating: audit-plugin-mysql---/README.txt
inflating: audit-plugin-mysql---/plugin-name.txt
creating: audit-plugin-mysql---/utils/
inflating: audit-plugin-mysql---/utils/offset-extract.sh
複制插件至MySQL lib庫目錄下
# cd audit-plugin-mysql-5.7-1.1.6-784/
# ls
COPYING lib plugin-name.txt README.txt THIRDPARTY.txt utils
# cd lib/
# ls
libaudit_plugin.so
# cp libaudit_plugin.so /usr/local/mysql/lib/plugin/
安裝插件
mysql> install plugin audit soname 'libaudit_plugin.so';
ERROR (HY000): File 'mysqld' not found (Errcode: - No such file or directory)
檢視錯誤日志
#tail -100f error.log
--T12::Z [Note] McAfee Audit Plugin: setup_offsets audit_offsets: (null) validate_checksum: offsets_by_version:
--T12::Z [ERROR] McAfee Audit Plugin: Failed file open: [mysqld], errno: Retrying with /proc//exe.
--T12::Z [Note] McAfee Audit Plugin: mysqld: mysqld (d78960dfa79b5da11bfbec180899a)
--T12::Z [Note] McAfee Audit Plugin: Couldn't find proper THD offsets for: -log
--T12::Z [ERROR] Plugin 'AUDIT' init function returned error.
--T12::Z [ERROR] Plugin 'AUDIT' registration as a AUDIT failed.
設定偏移量
# cd audit-plugin-mysql-5.7-1.1.6-784/utils
# sh offset-extract.sh /usr/local/mysql/bin/mysqld
//offsets for: /usr/local/mysql/bin/mysqld ()
{"5.7.23","630d78960dfa79b5da11bfbec180899a", , , , , , , , , , , , , , , , , , , , , , , , , },
編輯my3306.cnf檔案,添加以下内容。重新開機mysql
# vi /etc/my3306.cnf
plugin-load = AUDIT=libaudit_plugin.so
audit_json_file = ON
audit_offsets = , , , , , , , , , , , , , , , , , , , , , , , ,
audit_json_log_file = /data/mysql/mysql3306/mysql3306_audit.log
插件已成功安裝
root@localhost [(none)] ::> show plugins;
+----------------------------+----------+--------------------+--------------------+---------+
| Name | Status | Type | Library | License |
+----------------------------+----------+--------------------+--------------------+---------+
...
| AUDIT | ACTIVE | AUDIT | libaudit_plugin.so | GPL |
+----------------------------+----------+--------------------+--------------------+---------+
檢視審計日志内容
# cat mysql3306_audit.log
{"msg-type":"header","date":"1535376674438","audit-version":"1.1.6-784","audit-protocol-version":"1.0","hostname":"mysqldb1","mysql-version":"5.7.23-log","mysql-program":"mysqld","mysql-socket":"/tmp/mysql3306.sock","mysql-port":"3306","server_pid":"9433"}
{"msg-type":"activity","date":"1535376716799","thread-id":"2","query-id":"0","user":"root","priv_user":"root","ip":"","host":"localhost","connect_attrs":{"_os":"linux-glibc2.12","_client_name":"libmysql","_pid":"9532","_client_version":"5.7.23","_platform":"x86_64","program_name":"mysql"},"pid":"9532","os_user":"root","appname":"mysql","cmd":"Connect","query":"Connect"}
{"msg-type":"activity","date":"1535376716801","thread-id":"2","query-id":"2","user":"root","priv_user":"root","ip":"","host":"localhost","connect_attrs":{"_os":"linux-glibc2.12","_client_name":"libmysql","_pid":"9532","_client_version":"5.7.23","_platform":"x86_64","program_name":"mysql"},"pid":"9532","os_user":"root","appname":"mysql","rows":"1","status":"0","cmd":"select","query":"select @@version_comment limit 1"}
{"msg-type":"activity","date":"1535376716804","thread-id":"2","query-id":"3","user":"root","priv_user":"root","ip":"","host":"localhost","connect_attrs":{"_os":"linux-glibc2.12","_client_name":"libmysql","_pid":"9532","_client_version":"5.7.23","_platform":"x86_64","program_name":"mysql"},"pid":"9532","os_user":"root","appname":"mysql","rows":"1","status":"0","cmd":"select","query":"select USER()"}
{"msg-type":"activity","date":"1535376742218","thread-id":"2","query-id":"4","user":"root","priv_user":"root","ip":"","host":"localhost","connect_attrs":{"_os":"linux-glibc2.12","_client_name":"libmysql","_pid":"9532","_client_version":"5.7.23","_platform":"x86_64","program_name":"mysql"},"pid":"9532","os_user":"root","appname":"mysql","rows":"30","status":"0","cmd":"show_variables","objects":[{"db":"","obj_type":"TABLE"},{"db":"performance_schema","name":"session_variables","obj_type":"TABLE"}],"query":"show variables like '%audit%'"}
{"msg-type":"activity","date":"1535376757527","thread-id":"2","query-id":"5","user":"root","priv_user":"root","ip":"","host":"localhost","connect_attrs":{"_os":"linux-glibc2.12","_client_name":"libmysql","_pid":"9532","_client_version":"5.7.23","_platform":"x86_64","program_name":"mysql"},"pid":"9532","os_user":"root","appname":"mysql","rows":"45","status":"0","cmd":"show_plugins","objects":[{"db":"information_schema","name":"/data/mysql/mysql3306/tmp/#sql_24d9_0","obj_type":"TABLE"}],"query":"show plugins"}
{"msg-type":"activity","date":"1535376790256","thread-id":"2","query-id":"6","user":"root","priv_user":"root","ip":"","host":"localhost","connect_attrs":{"_os":"linux-glibc2.12","_client_name":"libmysql","_pid":"9532","_client_version":"5.7.23","_platform":"x86_64","program_name":"mysql"},"pid":"9532","os_user":"root","appname":"mysql","rows":"45","cmd":"Quit","query":"Quit"}
需要關心的參數
-
audit_json_file
是否開啟audit功能。
-
audit_json_log_file
記錄檔案的路徑和名稱資訊(預設放在mysql資料目錄下)。
-
audit_record_cmds
audit記錄的指令,預設為記錄所有指令。可以設定為任意dml、dcl、ddl的組合。如:audit_record_cmds=select,insert,delete,update。還可以線上設定set global audit_record_cmds=NULL。(表示記錄所有指令)
-
audit_record_objs
audit記錄操作的對象,預設為記錄所有對象,可以用SET GLOBAL audit_record_objs=NULL設定為預設。也可以指定為下面的格式:audit_record_objs=,test.,mysql.,information_schema.*。
-
audit_whitelist_users
使用者白名單。
-
audit_json_file=on
保證mysql重新開機後自動啟動插件
-
plugin-load=AUDIT=libaudit_plugin.so
防止删除了插件,重新開機後又會加載
7. 中繼日志
主從複制中,slave伺服器上一個很重要的檔案。
複制的工作原理分為以下3個步驟:
- 1) 主伺服器(master)把資料更改記錄到二進制日志(binlog)中。
- 2) 從伺服器(slave)把主伺服器的二進制日志複制到自己的中繼日志(relay log)中。
- 3) 從伺服器重做中繼日志中的日志,把更改應用到自己的資料庫上,以達到資料的最終一緻性。
8. Pid檔案
當MySQL執行個體啟動時,會将自己的程序ID寫入一個檔案中——該檔案即為pid檔案。
該檔案由參數pid_file控制,預設位于資料庫目錄下,檔案名為
主機名.pid
mysql> show variables like '%pid_file%';
+---------------+--------------+
| Variable_name | Value |
+---------------+--------------+
| pid_file | mysqldb1.pid |
+---------------+--------------+
1 row in set (0.00 sec)
9. 套接字檔案
在UNIX系統下本地連接配接MySQL可以采用UNIX域套接字方式,這種方式需要一個套接字(socket)檔案。
由參數socket控制:
mysql> show variables like 'socket';
+---------------+---------------------+
| Variable_name | Value |
+---------------+---------------------+
| socket | /tmp/mysql3306.sock |
+---------------+---------------------+
1 row in set (0.00 sec)
10. 表結構檔案
MySQL資料的存儲是根據表進行的,每個表都會有與之對應的檔案。但不論采用何種存儲引擎,MySQL都有一個以frm為字尾名的檔案,這個檔案記錄了該表的表結構定義。
frm可以存放視圖的定義,存放視圖定義的frm檔案是文本檔案,可以直接用cat檢視,例如:
# cat GLOBAL_STATUS.frm
TYPE=VIEW
query=select `information_schema`.`GLOBAL_STATUS`.`VARIABLE_NAME` AS `VARIABLE_NAME`,`information_schema`.`GLOBAL_STATUS`.`VARIABLE_VALUE` AS `VARIABLE_VALUE` from `INFORMATION_SCHEMA`.`GLOBAL_STATUS`
md5=dac896d268861732d0c40425f1e66cc6
updatable=
algorithm=
definer_user=root
definer_host=localhost
suid=
with_check_option=
timestamp=2018-08-20 06:29:
create-version=
source=SELECT * FROM `INFORMATION_SCHEMA`.`GLOBAL_STATUS`
client_cs_name=utf8
connection_cl_name=utf8_general_ci
view_body_utf8=select `information_schema`.`GLOBAL_STATUS`.`VARIABLE_NAME` AS `VARIABLE_NAME`,`information_schema`.`GLOBAL_STATUS`.`VARIABLE_VALUE` AS `VARIABLE_VALUE` from `INFORMATION_SCHEMA`.`GLOBAL_STATUS`
11. InnoDB存儲引擎檔案
分為redo log檔案,undo log檔案,表空間檔案(ibd檔案)
詳見博文InnoDB表空間,MySQL redo log 與 binlog 的差別