MySQL數據庫文件

MySQL數據庫文件

本文檔從MySQL數據庫和存儲引擎層面介紹各類類型的文件。html

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選項,如:

mysqld --defaults-file=/etc/my3306.cnf &

 

下面介紹一下常見參數文件/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',根據公式50 + (max_connections / 5)進行計算,上限900。人爲干預的最大值爲65535

  • 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,表示根據公式8 + (max_connections / 100)自動調整,上限值爲100。最大值16384

  • 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 
    表示嘗試獲取元數據鎖的超時(以秒爲單位),獲取metadata lock的超時(單位爲秒)
    包括對錶,視圖,存儲過程和存儲函數的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_data_file_path = ibdata1:1G;ibdata2:10M:autoextend 
    定義InnoDB系統表空間數據文件的名稱,大小和屬性

  • 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內的髒頁。

    在SSD存儲上應設置爲0(禁用) ,由於使用順序IO沒有任何性能收益. 在使用RAID的某些硬件上也應該禁用此設置,由於邏輯上連續的塊在物理磁盤上並不能保證也是連續的.

  • 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_rollback_on_timeout,則事務超時會致使InnoDB停止並回滾整個事務。

  • 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的啓動、運行、關閉過程進行了記錄。

下面示例是一個根據錯誤日誌來處理步驟。

示例準備

1). 在MySQL數據目錄手動建立mydir目錄,並更改成屬主爲mysql
# cd /data/mysql/mysql3306/data
# mkdir mydir
# chown mysql:mysql

 

2). 登錄mysql,使用命令show databases能夠看到mydir。
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
  ...
| mydir | +--------------------+ 13 rows in set (0.00 sec)

 

3). 在mydir數據庫中,建立表t1
mysql> use mydir
mysql> create table t1(c1 int);

 

4). 刪除datadir中的mydir目錄
# cd /data/mysql/mysql3306/data
# rm -rf mydir

 

5). 重啓MySQL 

根據錯誤日誌,來處理數據庫錯誤

1). 查看error log日誌
mysql> select @@log_error;
+---------------------------------+
| @@log_error                     |
+---------------------------------+
| /data/mysql/mysql3306/error.log |
+---------------------------------+

# tail -100f  /data/mysql/mysql3306/error.log

2018-08-26T13:13:15.132051Z 0 [ERROR] InnoDB: Operating system error number 2 in a file operation.
2018-08-26T13:13:15.132068Z 0 [ERROR] InnoDB: The error means the system cannot find the path specified.
2018-08-26T13:13:15.132074Z 0 [ERROR] InnoDB: If you are installing InnoDB, remember that you must create directories yourself, InnoDB does not create them.
2018-08-26T13:13:15.132079Z 0 [ERROR] InnoDB: Cannot open datafile for read-only: './mydir/t1.ibd' OS error: 71
2018-08-26T13:13:15.132084Z 0 [ERROR] InnoDB: Operating system error number 2 in a file operation.
2018-08-26T13:13:15.132087Z 0 [ERROR] InnoDB: The error means the system cannot find the path specified.
2018-08-26T13:13:15.132091Z 0 [ERROR] InnoDB: If you are installing InnoDB, remember that you must create directories yourself, InnoDB does not create them.
2018-08-26T13:13:15.132097Z 0 [ERROR] InnoDB: Could not find a valid tablespace file for `mydir/t1`. Please refer to http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting-datadict.html for how to resolve the issue.

 

2). 錯誤日誌中提示找不到/mydir/t1.ibd 表,mydir目錄不存在了。
mysql> 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 |
+----------+-----------------+------+--------+-------+-------------+------------+---------------+------------+
|      196 | mydir/t1        |   33 |      4 |   326 | Barracuda   | Dynamic    |             0 | Single     |
|      155 | sbtest/sbtest1  |   33 |      7 |   280 | Barracuda   | Dynamic    |             0 | Single     |
|      160 | sbtest/sbtest10 |   33 |      7 |   285 | Barracuda   | Dynamic    |             0 | Single     |
|      120 | test/t11        |   33 |      6 |   229 | Barracuda   | Dynamic    |             0 | Single     |
|      121 | test/t12        |   33 |      5 |   230 | Barracuda   | Dynamic    |             0 | Single     |
+----------+-----------------+------+--------+-------+-------------+------------+---------------+------------+
5 rows in set (0.00 sec)

 

3). 查看mydir的表結構
mysql> SELECT a.NAME,
    ->        b.name AS col_name,
    ->        CASE
    ->           WHEN b.MTYPE = 1 THEN 'VARCHAR'
    ->           WHEN b.MTYPE = 2 THEN 'CHAR'
    ->           WHEN b.MTYPE = 3 THEN 'FIXBINARY'
    ->           WHEN b.MTYPE = 4 THEN 'BINARY'
    ->           WHEN b.MTYPE = 5 THEN 'BLOB'
    ->           WHEN b.MTYPE = 6 THEN 'int'
    ->           WHEN b.MTYPE = 7 THEN 'SYS_CHILD'
    ->           WHEN b.MTYPE = 8 THEN 'SYS'
    ->           WHEN b.MTYPE = 9 THEN 'FLOAT'
    ->           WHEN b.MTYPE = 10 THEN 'DOUBLE'
    ->           WHEN b.MTYPE = 11 THEN 'DECIMAL'
    ->           WHEN b.MTYPE = 12 THEN 'VARMYSQL'
    ->           WHEN b.MTYPE = 13 THEN 'MYSQL'
    ->           WHEN b.MTYPE = 14 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  |
+----------+----------+------+
1 row in set (0.01 sec)

 

4). 在test庫中,建立一樣表結構的t1表。
mysql> create table t1(c1 int);

 

5). 在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

 

6). 刪除mydir數據庫
mysql> drop database mydir;

 

7). 從新查詢
mysql> SELECT a.NAME,
    ->        b.name AS col_name,
    ->        CASE
    ->           WHEN b.MTYPE = 1 THEN 'VARCHAR'
    ->           WHEN b.MTYPE = 2 THEN 'CHAR'
    ->           WHEN b.MTYPE = 3 THEN 'FIXBINARY'
    ->           WHEN b.MTYPE = 4 THEN 'BINARY'
    ->           WHEN b.MTYPE = 5 THEN 'BLOB'
    ->           WHEN b.MTYPE = 6 THEN 'int'
    ->           WHEN b.MTYPE = 7 THEN 'SYS_CHILD'
    ->           WHEN b.MTYPE = 8 THEN 'SYS'
    ->           WHEN b.MTYPE = 9 THEN 'FLOAT'
    ->           WHEN b.MTYPE = 10 THEN 'DOUBLE'
    ->           WHEN b.MTYPE = 11 THEN 'DECIMAL'
    ->           WHEN b.MTYPE = 12 THEN 'VARMYSQL'
    ->           WHEN b.MTYPE = 13 THEN 'MYSQL'
    ->           WHEN b.MTYPE = 14 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 (0.01 sec)

 

8). 重啓數據庫,觀察錯誤日誌,已沒有此前的錯誤。
# mysqladmin -S /tmp/mysql3306.sock shutdown
# tail -100f error.log

2018-08-26T14:09:16.614703Z 0 [Note] --secure-file-priv is set to NULL. Operations related to importing and exporting data are disabled
2018-08-26T14:09:16.614878Z 0 [Note] mysqld (mysqld 5.7.23-log) starting as process 591 ...
2018-08-26T14:09:16.625924Z 0 [Note] InnoDB: PUNCH HOLE support available
2018-08-26T14:09:16.626048Z 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2018-08-26T14:09:16.626058Z 0 [Note] InnoDB: Uses event mutexes
2018-08-26T14:09:16.626344Z 0 [Note] InnoDB: GCC builtin __sync_synchronize() is used for memory barrier
2018-08-26T14:09:16.626365Z 0 [Note] InnoDB: Compressed tables use zlib 1.2.3
2018-08-26T14:09:16.626369Z 0 [Note] InnoDB: Using Linux native AIO
2018-08-26T14:09:16.628539Z 0 [Note] InnoDB: Number of pools: 1
2018-08-26T14:09:16.628698Z 0 [Note] InnoDB: Using CPU crc32 instructions
2018-08-26T14:09:16.638746Z 0 [Note] InnoDB: Initializing buffer pool, total size = 2.5G, instances = 4, chunk size = 128M
2018-08-26T14:09:16.868792Z 0 [Note] InnoDB: Completed initialization of buffer pool
2018-08-26T14:09:16.890056Z 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().
2018-08-26T14:09:16.944638Z 0 [Note] InnoDB: Opened 95 undo tablespaces
2018-08-26T14:09:16.944697Z 0 [Note] InnoDB: 95 undo tablespaces made active
2018-08-26T14:09:16.945949Z 0 [Note] InnoDB: Highest supported file format is Barracuda.
2018-08-26T14:09:17.375987Z 0 [Note] InnoDB: Creating shared tablespace for temporary tables
2018-08-26T14:09:17.376087Z 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
2018-08-26T14:09:17.546965Z 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB.
2018-08-26T14:09:17.548799Z 0 [Note] InnoDB: 96 redo rollback segment(s) found. 96 redo rollback segment(s) are active.
2018-08-26T14:09:17.548850Z 0 [Note] InnoDB: 32 non-redo rollback segment(s) are active.
2018-08-26T14:09:17.549070Z 0 [Note] InnoDB: Waiting for purge to start
2018-08-26T14:09:17.607025Z 0 [Note] InnoDB: 5.7.23 started; log sequence number 1651418232
2018-08-26T14:09:17.608571Z 0 [Note] InnoDB: Loading buffer pool(s) from /data/mysql/mysql3306/data/ib_buffer_pool
2018-08-26T14:09:17.611403Z 0 [Note] Plugin 'FEDERATED' is disabled.
2018-08-26T14:09:17.749763Z 0 [Warning] Failed to set up SSL because of the following SSL library error: SSL context is not usable without certificate and private key
2018-08-26T14:09:17.749789Z 0 [Note] Server hostname (bind-address): '*'; port: 3306
2018-08-26T14:09:17.749851Z 0 [Note] IPv6 is available.
2018-08-26T14:09:17.749860Z 0 [Note]   - '::' resolves to '::';
2018-08-26T14:09:17.749874Z 0 [Note] Server socket created on IP: '::'.
2018-08-26T14:09:17.886092Z 0 [Note] Event Scheduler: Loaded 0 events
2018-08-26T14:09:17.886277Z 0 [Note] mysqld: ready for connections.
Version: '5.7.23-log'  socket: '/tmp/mysql3306.sock'  port: 3306  MySQL Community Server (GPL)
2018-08-26T14:09:18.038313Z 0 [Note] InnoDB: Buffer pool(s) load completed at 180826 22:09:18

 

3. 二進制日誌文件

binlog記錄了對MySQL數據庫執行更改的全部操做,可是不包括SELECT和SHOW這類操做,由於這類操做對數據自己並無修改。而後,若操做自己並無致使數據庫發生變化,那麼該操做也會寫入二進制日誌,詳細信息請參考博文MySQL redo log 與 binlog 的區別

二進制日誌的主要做用:

  • 1)能夠完成主從複製。在主服務器上把全部修改數據的操做記錄到binlog中,經過網絡發送給從服務器,從而達到主從同步。

  • 2)進行恢復操做。數據能夠經過binlog日誌,使用mysqlbinlog命令,實現基於時間點和位置的恢復操做。

3.1 數據庫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.000002 |     1921 |              |                  | e4382832-949d-11e8-97ba-080027793430:1-10 |
+----------------------+----------+--------------+------------------+-------------------------------------------+
1 row in set (0.00 sec)

mysql> show binlog events in 'my3306_binlog.000002';
+----------------------+------+----------------+-----------+-------------+---------------------------------------------------------------------+
| Log_name             | Pos  | Event_type     | Server_id | End_log_pos | Info                                                                |
+----------------------+------+----------------+-----------+-------------+---------------------------------------------------------------------+
| my3306_binlog.000002 |    4 | Format_desc    |   1003306 |         123 | Server ver: 5.7.23-log, Binlog ver: 4                               |
| my3306_binlog.000002 |  123 | Previous_gtids |   1003306 |         194 | e4382832-949d-11e8-97ba-080027793430:1-4                            |
| my3306_binlog.000002 |  194 | Gtid           |   1003306 |         259 | SET @@SESSION.GTID_NEXT= 'e4382832-949d-11e8-97ba-080027793430:5'   |
| my3306_binlog.000002 |  259 | Query          |   1003306 |         390 | use `test`; create table pitr(name varchar(30), birthday timestamp) |
| my3306_binlog.000002 |  390 | Gtid           |   1003306 |         455 | SET @@SESSION.GTID_NEXT= 'e4382832-949d-11e8-97ba-080027793430:6'   |
| my3306_binlog.000002 |  455 | Query          |   1003306 |         535 | BEGIN                                                               |
| my3306_binlog.000002 |  535 | Rows_query     |   1003306 |         602 | # insert into pitr values('張三',sysdate())                         |
| my3306_binlog.000002 |  602 | Table_map      |   1003306 |         653 | table_id: 122 (test.pitr)                                           |
| my3306_binlog.000002 |  653 | Write_rows     |   1003306 |         700 | table_id: 122 flags: STMT_END_F                                     |
| my3306_binlog.000002 |  700 | Xid            |   1003306 |         731 | COMMIT /* xid=612 */                                                |
| my3306_binlog.000002 |  731 | Gtid           |   1003306 |         796 | SET @@SESSION.GTID_NEXT= 'e4382832-949d-11e8-97ba-080027793430:7'   |
| my3306_binlog.000002 |  796 | Query          |   1003306 |         876 | BEGIN                                                               |
| my3306_binlog.000002 |  876 | Rows_query     |   1003306 |         943 | # insert into pitr values('李四',sysdate())                         |
| my3306_binlog.000002 |  943 | Table_map      |   1003306 |         994 | table_id: 122 (test.pitr)                                           |
| my3306_binlog.000002 |  994 | Write_rows     |   1003306 |        1041 | table_id: 122 flags: STMT_END_F                                     |
| my3306_binlog.000002 | 1041 | Xid            |   1003306 |        1072 | COMMIT /* xid=613 */                                                |
| my3306_binlog.000002 | 1072 | Gtid           |   1003306 |        1137 | SET @@SESSION.GTID_NEXT= 'e4382832-949d-11e8-97ba-080027793430:8'   |
| my3306_binlog.000002 | 1137 | Query          |   1003306 |        1209 | BEGIN                                                               |
| my3306_binlog.000002 | 1209 | Rows_query     |   1003306 |        1269 | # delete from pitr where name='李四'                                |
| my3306_binlog.000002 | 1269 | Table_map      |   1003306 |        1320 | table_id: 122 (test.pitr)                                           |
| my3306_binlog.000002 | 1320 | Delete_rows    |   1003306 |        1367 | table_id: 122 flags: STMT_END_F                                     |
| my3306_binlog.000002 | 1367 | Xid            |   1003306 |        1398 | COMMIT /* xid=615 */                                                |
| my3306_binlog.000002 | 1398 | Gtid           |   1003306 |        1463 | SET @@SESSION.GTID_NEXT= 'e4382832-949d-11e8-97ba-080027793430:9'   |
| my3306_binlog.000002 | 1463 | Query          |   1003306 |        1543 | BEGIN                                                               |
| my3306_binlog.000002 | 1543 | Rows_query     |   1003306 |        1610 | # insert into pitr values('王五',sysdate())                         |
| my3306_binlog.000002 | 1610 | Table_map      |   1003306 |        1661 | table_id: 122 (test.pitr)                                           |
| my3306_binlog.000002 | 1661 | Write_rows     |   1003306 |        1708 | table_id: 122 flags: STMT_END_F                                     |
| my3306_binlog.000002 | 1708 | Xid            |   1003306 |        1739 | COMMIT /* xid=616 */                                                |
| my3306_binlog.000002 | 1739 | Gtid           |   1003306 |        1804 | SET @@SESSION.GTID_NEXT= 'e4382832-949d-11e8-97ba-080027793430:10'  |
| my3306_binlog.000002 | 1804 | Query          |   1003306 |        1921 | use `test`; DROP TABLE `pitr` /* generated by server */             |
+----------------------+------+----------------+-----------+-------------+---------------------------------------------------------------------+
30 rows in set (0.00 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=1535343183/*!*/;
SET @@session.pseudo_thread_id=21/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1436549152/*!*/;
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=45/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
SET @@session.explicit_defaults_for_timestamp=1/*!*/;
create table pitr(name varchar(20),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=1535343220/*!*/;
SET @@session.sql_mode=524288/*!*/;
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=1535343226/*!*/;
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=1535345966/*!*/;
SET @@session.sql_mode=1436549152/*!*/;
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 COMPLETION_TYPE=@OLD_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模式能不能恢復

0) ON 模式(新的和複製的事務都必須是GTID事務。)

1) ON_PERMISSIVE 模式(新事務是GTID事務,複製事務能夠是GTID也能夠不是GTID事務)

root@localhost [test] 13:18:14> set global gtid_mode ='ON_PERMISSIVE';
Query OK, 0 rows affected (0.04 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

root@localhost [test] 13:19:09> select * from pitr;
ERROR 1146 (42S02): Table 'test.pitr' doesn't exist

2) OFF_PERMISSIVE 模式(新事務不是GTID事務,複製事務能夠是GTID也能夠不是GTID事務)
root@localhost [test] 13:19:46> 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

root@localhost [test] 13:21:06> select * from pitr;
ERROR 1146 (42S02): Table 'test.pitr' doesn't exist

3) OFF模式(不產生GTID,只接受不帶GTID的事務)  
root@localhost [test] 13:21:16> set global gtid_mode ='OFF';
# mysqlbinlog --no-defaults  --stop-position='1072' /data/mysql/mysql3306/my3306_binlog.000002 | mysql -S /tmp/mysql3306.sock
ERROR 1781 (HY000) at line 17: @@SESSION.GTID_NEXT cannot be set to UUID:NUMBER when @@GLOBAL.GTID_MODE = OFF.

[root@mysqldb1 13:22:56 /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 1781 (HY000) at line 15: @@SESSION.GTID_NEXT cannot be set to UUID:NUMBER when @@GLOBAL.GTID_MODE = OFF.

說明不能恢復。。。

 

3.1.5 加上選項--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

使用mysqlbinlog命令,實現基於位置的恢復操做

mysql> select @@gtid_mode;
+-------------+
| @@gtid_mode |
+-------------+
| OFF         |
+-------------+
1 row in set (0.00 sec)

root@localhost [(none)] 14:06:07> use test;
Database changed
root@localhost [test] 14:06:17> create table pitr(c1 int);
Query OK, 0 rows affected (0.08 sec)

root@localhost [test] 14:06:41> insert into pitr select 1;
Query OK, 1 row affected (0.02 sec)
Records: 1  Duplicates: 0  Warnings: 0

root@localhost [test] 14:06:52> insert into pitr select 2;
Query OK, 1 row affected (0.03 sec)
Records: 1  Duplicates: 0  Warnings: 0

root@localhost [test] 14:06:55> insert into pitr select 3;
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0

root@localhost [test] 14:06:58> drop table pitr;
Query OK, 0 rows affected (0.04 sec)

root@localhost [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)

root@localhost [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

root@localhost [(none)] 14:08:21> use test;
Database changed
root@localhost [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: 1  Time=2.85s (2s)  Lock=0.00s (0s)  Rows=331603.0 (331603), wanbin[wanbin]@[192.168.56.1]
  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
  # User@Host: 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: 1  Time=1.55s (1s)  Lock=0.00s (0s)  Rows=331603.0 (331603), wanbin[wanbin]@[192.168.56.1]
  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=0.41s (0s)  Rows=1.0 (1), root[root]@localhost
  select * from schema_auto_increment_columns

Count: 1  Time=0.00s (0s)  Lock=0.09s (0s)  Rows=8.0 (8), 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工具包

# tar -zxvf percona-toolkit-3.0.11_x86_64.tar.gz

 

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-3.0.11/bin/pt-query-digest line 75.

 

報錯提示缺乏了Data/Dumper.pm 包
wget http://www.cpan.org/modules/by-module/Data/Data-Dumper-2.161.tar.gz

# tar -xvzf Data-Dumper-2.161.tar.gz 

# cd Data-Dumper-2.161/

# 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-3.0.11/bin/pt-query-digest line 2470.
BEGIN failed--compilation aborted at /opt/percona-toolkit-3.0.11/bin/pt-query-digest line 2470.

 

又提示缺包。。
# yum -y install perl-Digest-MD5

 

再分析
# pt-query-digest /data/mysql/mysql3306/slow.log 

# 250ms user time, 20ms system time, 20.30M rss, 174.68M vsz
# Current date: Mon Aug 27 14:53:12 2018
# Hostname: mysqldb1
# Files: /data/mysql/mysql3306/slow.log
# Overall: 268 total, 90 unique, 0.00 QPS, 0.00x concurrency _____________
# Time range: 2018-08-01T02:24:23 to 2018-08-26T14:29:23
# Attribute          total     min     max     avg     95%  stddev  median
# ============     ======= ======= ======= ======= ======= ======= =======
# Exec time            42s   316us      3s   157ms   393ms   252ms   116ms
# Lock time          957ms       0   406ms     4ms     6ms    26ms    28us
# Rows sent          2.58M       0 323.83k   9.85k  511.45  51.51k   97.36
# Rows examine       4.12M       0 971.49k  15.76k   9.80k  83.39k  192.76
# Query size        28.02k      19   1.11k  107.06  511.45  163.57   56.92

# Profile
# Rank Query ID                         Response time Calls R/Call V/M   I
# ==== ================================ ============= ===== ====== ===== =
#    1 0xA729E7889F57828D3821AE1F716...  9.3447 22.2%    47 0.1988  0.04 SELECT sbtest?
#    2 0xFF7C69F51BBD3A736EEB1BFDCCF...  7.3304 17.5%    42 0.1745  0.04 SELECT sbtest?
#    3 0xF0C5AE75A52E847D737F39F04B1...  4.9573 11.8%    29 0.1709  0.03 SELECT sbtest?
#    4 0x9934EF6887CC7A6384D1DEE77FA...  4.9344 11.7%    35 0.1410  0.01 SELECT sbtest?
#    5 0xF7424F4815EECCF244D3DC308F4...  3.6196  8.6%     3 1.2065  0.00 SELECT dept_emp
#    6 0x589AC02E8EA38FF73755BE6B68C...  2.8542  6.8%     1 2.8542  0.00 SELECT employees.dept_emp employees.departments employees.employees
 information_schema.tables
#    7 0xDB9BE8D3B05BEF64B13C834B887...  1.6024  3.8%     2 0.8012  0.00 SELECT information_schema.innodb_buffer_page
#    8 0x1038022FC2BA7F900E5A45FBEF0...  1.5519  3.7%     1 1.5519  0.00 SELECT employees.dept_emp employees.departments
#    9 0xA5FAF17DCA069D1E9FC702E9D19...  1.2378  2.9%     1 1.2378  0.00 SELECT innodb_buffer_stats_by_schema
#   10 0xB50AD757EF59AF1382ECBFB7827...  0.5968  1.4%     3 0.1989  0.09 SELECT INFORMATION_SCHEMA.FILES INFORMATION_SCHEMA.PARTITIONS
#   11 0x77465EBF6BA1D66F44A19FF46A7...  0.5883  1.4%     1 0.5883  0.00 SELECT schema_auto_increment_columns
#   12 0x70A8C2B22252441D191B17EB508...  0.4334  1.0%     1 0.4334  0.00 SELECT innodb_buffer_stats_by_table
#   13 0xDB534C97AF86024F633F5856DF7...  0.4042  1.0%     1 0.4042  0.00 SELECT employees
#   14 0xE3C753C2F267B2D767A347A2812...  0.3302  0.8%     1 0.3302  0.00 SELECT help_topic
#   15 0xA3A7D9D5A6985CE9A553C9BA246...  0.3289  0.8%     1 0.3289  0.00 SELECT dept_emp
# MISC 0xMISC                            1.8876  4.5%    99 0.0191   0.0 <75 ITEMS>

# Query 1: 2.04 QPS, 0.41x concurrency, ID 0xA729E7889F57828D3821AE1F716D5205 at byte 68014
# This item is included in the report because it matches --limit.
# Scores: V/M = 0.04
# Time range: 2018-08-25T00:50:18 to 2018-08-25T00:50:41
# Attribute    pct   total     min     max     avg     95%  stddev  median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count         17      47
# Exec time     22      9s   101ms   502ms   199ms   356ms    88ms   167ms
# Lock time      0     1ms    14us   263us    25us    30us    35us    18us
# Rows sent      0   4.59k     100     100     100     100       0     100
# Rows examine   0   4.59k     100     100     100     100       0     100
# Query size     8   2.48k      54      55   54.04   51.63    0.50   51.63
# String:
# Databases    move_db
# Hosts        localhost
# Users        root
# Query_time distribution
#   1us
#  10us
# 100us
#   1ms
#  10ms
# 100ms  ################################################################
#    1s
#  10s+
# Tables
#    SHOW TABLE STATUS FROM `move_db` LIKE 'sbtest1'\G
#    SHOW CREATE TABLE `move_db`.`sbtest1`\G
# EXPLAIN /*!50100 PARTITIONS*/
SELECT c FROM sbtest1 WHERE id BETWEEN 22744 AND 22843\G

 

5. 全量日誌

general log會記錄MySQL數據庫全部操做的SQL語句,包含select和show。
默認狀況下,禁用常規查詢日誌。

  • general log相關參數

    general_log=0 
    #表示禁用general log
    
    general_log_file = file_name
    #表示general log的文件名,默認以hostname.log命名
    
    log_output
    表示輸出格式,有三種方式:TABLE,FILE,NONE.默認是輸出至FILE格式

     

  • 查看general log

    mysql> set global general_log=1;
    Query OK, 0 rows affected (0.02 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
    2018-08-27T12:31:47.236802Z        5 Quit

     

6. 審計日誌

數據庫審計可以實時記錄網絡上的數據庫活動,對數據庫操做進行細粒度審計的合規性管理,對數據庫遭受到的風險行爲進行告警,對攻擊行爲進行阻斷。

它經過對用戶訪問數據庫行爲的記錄、分析和彙報,用來幫助用戶過後生成合規報告,事故追根溯源,同時增強內外部數據庫網絡行爲記錄,提升數據資產安全。

MySQL數據庫官方的收費組件須要購買企業版纔可使用審計功能。下面利用第三方開源審計插件完成審計工做。

1). 下載插件包
# 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

 

2). 解壓
# unzip download_file\?file_path\=audit-plugin-mysql-5.7-1.1.6-784-linux-x86_64.zip 

 

3). 複製插件至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/

 

4). 安裝插件
mysql> install plugin audit soname 'libaudit_plugin.so';
ERROR 29 (HY000): File 'mysqld' not found (Errcode: 2 - No such file or directory)

 

5). 查看錯誤日誌
#tail -100f error.log

2018-08-27T12:53:17.364957Z 8 [Note] McAfee Audit Plugin: setup_offsets audit_offsets: (null) validate_checksum: 1 offsets_by_version: 1
2018-08-27T12:53:17.364977Z 8 [ERROR] McAfee Audit Plugin: Failed file open: [mysqld], errno: 2. Retrying with /proc/2193/exe.
2018-08-27T12:53:20.765251Z 8 [Note] McAfee Audit Plugin: mysqld: mysqld (630d78960dfa79b5da11bfbec180899a) 
2018-08-27T12:53:20.765280Z 8 [Note] McAfee Audit Plugin: Couldn't find proper THD offsets for: 5.7.23-log
2018-08-27T12:53:20.765284Z 8 [ERROR] Plugin 'AUDIT' init function returned error.
2018-08-27T12:53:20.765287Z 8 [ERROR] Plugin 'AUDIT' registration as a AUDIT failed.

 

6). 設置偏移量
# 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)
{"5.7.23","630d78960dfa79b5da11bfbec180899a", 7824, 7872, 3632, 4792, 456, 360, 0, 32, 64, 160, 536, 7988, 4360, 3648, 3656, 3660, 6072, 2072, 8, 7056, 7096, 7080, 13464, 148, 672},

編輯my3306.cnf文件,添加如下內容。重啓mysql

# vi /etc/my3306.cnf

plugin-load             = AUDIT=libaudit_plugin.so
audit_json_file         = ON
audit_offsets           = 7824, 7872, 3632, 4792, 456, 360, 0, 32, 64, 160, 536, 7988, 4360, 3648, 3656, 3660, 6072, 2072, 8, 7056, 7096, 7080, 13464, 148, 672
audit_json_log_file     = /data/mysql/mysql3306/mysql3306_audit.log

 

7). 插件已成功安裝
root@localhost [(none)] 21:32:22> show plugins;
+----------------------------+----------+--------------------+--------------------+---------+
| Name                       | Status   | Type               | Library            | License |
+----------------------------+----------+--------------------+--------------------+---------+
...
| AUDIT                      | ACTIVE   | AUDIT              | libaudit_plugin.so | GPL     |
+----------------------------+----------+--------------------+--------------------+---------+

 

8). 查看審計日誌內容
# 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=0
algorithm=0
definer_user=root
definer_host=localhost
suid=0
with_check_option=0
timestamp=2018-08-20 06:29:43
create-version=1
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 的區別

相關文章
相關標籤/搜索