MySQL數據庫文件
本文檔從MySQL數據庫和存儲引擎層面介紹各種類型的文件。
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文件,每秒把數據刷入到磁盤中。
- 默認值為1
-
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文件)