一、MySQL日志与备份
一、MySQL日志管理
1、MySQL日志文件
- 常用的日志文件(在/etc/my.cnf中[mysqld]客戶端配置中修改)
- MySQL的默認日志保存位置為/usr/local/mysql/data
錯誤日志
用于記錄MySQL啟動、停止或運行時發生的錯誤信息,默認已開啟
指定日志的保存位置和文件名 log-error=/usr/local/mysql/data/mysql_error.log二進制日志
用來記錄所有更新了數據或者已經潛在更新了數據的語句,記錄了數據的更改,可用于數據恢復
log-bin=mysql-bin 或 log_bin=mysql-bin中繼日志
一般情況下它在MySQL主從同步、讀寫分離集群的從節點才開啟,主節點一般不需要這個日志。
慢查詢日志
用來記錄所有執行時間超過long_query_time秒的語句,可以找到哪些查詢語句執行時間長,以便于優化,默認是關閉的
slow_query_log=ON slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log #指定文件路徑和名稱 long_query_time=5 #設置執行超過5秒的語句會被記錄,缺省時間為10秒systemctl restart mysqld二、查看日志狀態命令
1、查看通用查詢日志是否開啟
mysql -u root -p show variables like 'general%';2、查看二進制日志是否開啟
show variables like 'log_bin%';3、查看慢查詢日功能是否開啟
show variables like '%slow%';查看慢查詢時間設置
show variables like 'long_query_time';在數據庫中設置開啟慢查詢的方法(臨時)
set global slow_query_log=ON; 該方法重啟服務失效三、備份的重要性
在企業中數據的價值至關重要,數據保障了企業業務的正常運行。因此,數據的安全性及數據的可靠性是運維的重中之重,任何數據的丟失都可能對企業產生嚴重的后果。
1、造成數據丟失的原因有如下幾種
程序錯誤
人為操作錯誤
運算錯誤
磁盤故障
災難(如火災、地震)和盜竊
四、備份類型
1、從物理與邏輯的角度分類
數據庫備份可以分為物理備份和邏輯備份。物理備份是對數據庫操作系統的物理文件 (如數據文件、日志文件等)的備份。這種類型的備份適用于在出現問題時需要快速恢復的大型重要數據庫。物理備份又可以分為 冷備份(脫機備份)、熱備份(聯機備份)和溫備份。
冷備份:在數據庫關閉狀態下進行備份操作。(tar)
熱備份:在數據庫處于運行狀態時進行備份操作,該備份方法依賴數據庫的日志文件。(mysqldump)
溫備份:數據庫鎖定表格(不可寫入但可讀)的狀態下進行備份操作。
邏輯備份是對數據庫邏輯組件(如表等數據庫對象)的備份,表示為邏輯數據庫結構(CREATE DATABASB,CREATBTABLE語句)和內容(INSERT語句或分隔文本文件)的信息。這種類型的備份適用于可以編輯數據值或表結構較小的數據量,或者在不同的機器體系結構上重新創建數據
2、從數據庫的備份策略角度分類
從數據庫的備份策略角度,數據庫的備份可分為完全備份、差異備份和增量備份(面試點)
完全備份:每次對數據進行完整的備份,即對整個數據庫、數據庫結構和文件結構的備份,保存的是備份完成時刻的數據庫,是差異備份與增量備份的基礎。完全備份的備份與恢復操作都非常簡單方便,但是數據存在大量的重復,并且會占用大量的磁盤空間,備份的時間也很長。
差異備份:備份那些自從上次完全備份之后被修改過的所有文件,備份的時間節點是從上次完整備份起,備份數據量會越來越大。恢復數據時,只需恢復上次的完全備份與最近的一次差異備份。
增量備份:只有那些在上次完全備份或者增量備份后被修改的文件才會被備份。以上次完整備份或上次增量備份的時間為時間點,僅備份這之間的數據變化,因而備份的數據量小,占用空間小,備份速度快。但恢復時,需要從上一次的完整備份開始到最后一次增量備份之的所有增量依次恢復,如中間某次的備份數據損壞,將導致數據的丟失。
3、備份方法
數據庫的備份可以采用很多種方式,如直接打包數據庫文件(物理冷備份)、專用備份工具(mysqldump)、二進制日志增量備份、第三方工具備份等。
物理冷備份
物理冷備份時需要在數據庫處于關閉狀態下,能夠較好地保證數據庫的完整性。物理冷備份一般用于非核心業務,這類業務一般都允許中斷,物理冷備份的特點就是速度快,恢復時也是最為簡單的。通常通過直接打包數據庫文件夾(/usr/local/mysql/data)來實現備份
專用備份工具mysqldump或mysqlhotcopy
mysqldump程序和mysqlhotcopy都可以做備份。 mysqldump是客戶端常用邏輯備份程序,能夠產生一組被執行以后再現原始數據庫對象定義和表數據的sgr語句。它可以轉儲一個到多個MysQI數據庫,對其進行備份或傳輸到遠程sQI服務器。mysqldump更為通用, 因為它可以備份各種表。 mysqlhotcopy 僅適用于某些存儲引擎。
通過啟用二進制日志進行增量備份MySQL 支持增量備份,進行增量備份時必須啟用二進制日志。二進制日志文件為用戶提供復制,對執行備份點后進行的數據庫更改所需的信息進行恢復。如果進行增量備份(包含自上次完全備份或增量備份以來發生的數據修改),需要刷新二進制日志。 通過第三方工具備份 Percona XtraBackup是一個免費的 MySgL熱備份軟件,支持在線熱備份Innodb 和xtraDB,也可以支持MySQL表備份,不過 MyISAM表的備份要在表鎖的情況下進行。
五、數據庫冷備份與恢復及完全備份與恢復的基本命令
1、物理冷備份與恢復
systemctl stop mysqld yum -y install xz (一種壓縮工具,詳單與gzip,bz2)壓縮備份 tar Jcvf /opt/mysql_all_$(date +%F).tar.xz /usr/local/mysql/data/解壓恢復 tar Jxvf /opt/mysql_all_2021-04-14.tar.xz -C /usr/local/mysql/datasystemctl restart mysql2、mysqldump 備份與恢復
完全備份一個或多個完整的庫(包括其中所有的表)
mysqldump -u root -p[密碼] --databases 庫名1 [庫名2] … > /備份路徑/備份文件名.sql #導出的就是數據庫腳本文件
例:
mysqldump -uroot -p35123512 --databases school > /opt/school.sql完全備份 MySQL 服務器中所有的庫
mysqldump -u root -p[密碼] --all-databases > /備份路徑/備份文件名.sql
例:
mysqldump -u root -p35123512 --all-databases > /opt/all_database.sql完全備份指定庫中的部分表
mysqldump -u root -p[密碼] 庫名 [表名1] [表名2] … > /備份路徑/備份文件名.sql
例:
mysqldump -uroot -p35123512 school test > /opt/school_test.sql #使用“-d”選項,說明只保存數據庫的表結構 #不使用“-d”選項,說明表數據也進行備份3、查看備份文件
cat /opt/備份的文件 |grep -v "^--" | grep -v "^/" | grep -v "^$"grep -v "^--" /opt/school_test.sql | grep -v "^/" | grep -v "^$"4、MySQL 完全恢復
恢復數據庫
#“-e”選項,用于指定連接 MySQL 后執行的命令,命令執行完后自動退出 mysql -u root -p -e 'drop database school;' mysql -u root -p -e 'show databases;'mysql -u root -p < /opt/school.sql mysql -u root -p -e 'show databases;'六、MySQL增量備份與恢復
1、二進制日志(binlog)有三種不同的記錄格式
STATEMENT(基于SQL語句)
binlog format=STATEMENT默認 每一條涉及到被修改的sql都會記錄在binlog中。 缺點:日志量過大,如sleep()函數, last_insert_id()>,以及user-definedfunctions(udf)、主從復制等架構記錄日志時會出問題會出現問題
ROW(基于行)
shell binlog format=ROw 只記錄變動的記錄,不記錄sql的上下文環境。 缺點:如果遇到updata … set … where true那么就binlog的數據量就變大
MIXED(混合模式)
binlog format=M工XED推薦使用 一般的語句使用statement,函數使用ROW方式存取。
2、MySQL增量備份
開啟二進制日志文件
可每周對數據庫或表進行完全備份(增量備份是基于完全備份,所以這里我們直接備份數據庫)
#完全備份
mysqldump -u root -p school test > /opt/school_test_$(date +%F).sql mysqldump -u root -p school > /opt/school_$(date +%F).sql#使用crontab -e 計劃性任務來執行;每周1凌晨2點對表test和school庫進行完全備份 0 2 * * 1 mysqldump -u root -p school test > /opt/school_test_$(date +%F).sql 0 2 * * 1 mysqldump -u root -p school > /opt/school_$(date +%F).sql可每天進行增量備份操作,生成新的二進制日志文件(例如 mysql-bin.000002)
mysqladmin -u root -p flush-logs插入新數據,以模擬數據的增加或變更
mysql -u root -p use school; insert into test values (3,'李四','廣州'); insert into test values (4,'五一','南京');再次生成新的二進制日志文件(例如 mysql-bin.000003)
mysqladmin -u root -p flush-logs #上面我們往test表中插入數據的操作會保存到mysql-bin.000002文件中,之后數據庫數據再發生變化則保存在mysql-bin.000003文件中查看二進制日志文件的內容
cp /usr/local/mysql/data/mysql-bin.000002 /opt/ mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002 #--base64-output=decode-rows:使用64位編碼機制去解碼并按行讀取 #-v:顯示詳細內容3、MySQL 增量恢復
一般恢復
模擬丟失更改的數據的恢復步驟
mysql -u root -p use school; delete from test where id=3; delete from test where id=4; select * from test; quitmysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -u root -p mysql -u root -p -e "select * from school.test;"模擬丟失所有數據的恢復步驟
mysql -u root -p use school; drop table test; show tables; quitmysql -uroot -p school < /opt/school_test_2021-04-15.sql mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -uroot -p mysql -u root -p -e "select * from school.test;"
斷點恢復
mysqladmin -uroot -p35123512 flush-logs 進行日志刷新 查看我們剛才操作保存的日志000007二進制日志文件 mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql-bin.000007 # at 219 #210415 17:09:24 server id 1 end_log_pos 354 CRC32 0x00c7f80d Query thread_id=38 exec_time=0 error_code=0 use `school`/*!*/; SET TIMESTAMP=1618477764/*!*/; SET @@session.pseudo_thread_id=38/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; SET @@session.sql_mode=1437073414/*!*/; 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=33/*!*/; SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; create table test (id int(5),name varchar(10),age int(5)) /*!*/; # at 354 #210415 17:11:10 server id 1 end_log_pos 419 CRC32 0x6ed07c34 Anonymous_GTID last_committed=1 sequence_number=2 rbr_only=no SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/; # at 419 #210415 17:11:10 server id 1 end_log_pos 502 CRC32 0xba0129d4 Query thread_id=38 exec_time=0 error_code=0 SET TIMESTAMP=1618477870/*!*/; BEGIN /*!*/; # at 502 #210415 17:11:10 server id 1 end_log_pos 639 CRC32 0x463df0b3 Query thread_id=38 exec_time=0 error_code=0 SET TIMESTAMP=1618477870/*!*/; insert into test values (1,'張三','10'),(2,'李四','20') /*!*/; # at 639 #210415 17:11:10 server id 1 end_log_pos 670 CRC32 0xda19363b Xid = 499 COMMIT/*!*/; # at 670 #210415 17:11:32 server id 1 end_log_pos 735 CRC32 0x99150b17 Anonymous_GTID last_committed=2 sequence_number=3 rbr_only=no SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/; # at 735 #210415 17:11:32 server id 1 end_log_pos 818 CRC32 0x34f81d52 Query thread_id=38 exec_time=0 error_code=0 SET TIMESTAMP=1618477892/*!*/; BEGIN /*!*/; # at 818 #210415 17:11:32 server id 1 end_log_pos 937 CRC32 0x80433f9d Query thread_id=38 exec_time=0 error_code=0 SET TIMESTAMP=1618477892/*!*/; insert into test values (3,'王五','25') /*!*/; # at 937 #210415 17:11:32 server id 1 end_log_pos 968 CRC32 0xd3537b3b Xid = 500 COMMIT/*!*/; # at 968 #210415 17:12:40 server id 1 end_log_pos 1033 CRC32 0x91cc3262 Anonymous_GTID last_committed=3sequence_number=4 rbr_only=no SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/; # at 1033 #210415 17:12:40 server id 1 end_log_pos 1116 CRC32 0x17bd5f4a Query thread_id=38 exec_time=0 error_code=0 SET TIMESTAMP=1618477960/*!*/; BEGIN /*!*/; # at 1116 1116位置是模擬我們誤刪除文件的操作 #210415 17:12:40 server id 1 end_log_pos 1221 CRC32 0x35e5f3c9 Query thread_id=38 exec_time=0 error_code=0 SET TIMESTAMP=1618477960/*!*/; delete from test where id=1 /*!*/; # at 1221 #210415 17:12:40 server id 1 end_log_pos 1252 CRC32 0x5868d5c4 Xid = 503 COMMIT/*!*/; # at 1252 #210415 17:13:06 server id 1 end_log_pos 1317 CRC32 0xc864fc14 Anonymous_GTID last_committed=4sequence_number=5 rbr_only=no SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/; # at 1317 #210415 17:13:06 server id 1 end_log_pos 1400 CRC32 0x8c31a8b8 Query thread_id=38 exec_time=0 error_code=0 SET TIMESTAMP=1618477986/*!*/; BEGIN /*!*/; # at 1400 #210415 17:13:06 server id 1 end_log_pos 1519 CRC32 0xaef20ea3 Query thread_id=38 exec_time=0 error_code=0 SET TIMESTAMP=1618477986/*!*/; insert into test values (4,'田一','30') /*!*/;基于位置恢復
這邊我們模擬刪除id=1的操作為誤刪除 我們進行恢復
恢復到操作ID為‘1116’之前的數據,就是不執行刪除id=1的操作 mysqlbinlog --no-defaults --stop-position='1116' /usr/local/mysql/data/mysql-bin.000007 | mysql -uroot -p35123512 意思就是跳過我們刪除的操作其余的都恢復 mysqlbinlog --no-defaults --start-position='1400' /usr/local/mysql/data/mysql-bin.000007 | mysql -uroot -p35123512操作前首先要刪除需要備份的表
基于時間點恢復
刪除school庫中的test表,先基于完整備份的恢復,在基于時間點恢復
總結:斷點恢復
如果恢復某條SQL語句之前的所有數據,就stop在這個語句的位置節點或者時間點
G9nLmNzZG4ubmV0L0lIQk9T,size_16,color_FFFFFF,t_70)
總結:斷點恢復
如果恢復某條SQL語句之前的所有數據,就stop在這個語句的位置節點或者時間點
如果恢復某條SQ語句以及之后的所有數據,就從這個語句的位置節點或者時間點start
總結
以上是生活随笔為你收集整理的一、MySQL日志与备份的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LVS-DR+Keepalived 高可
- 下一篇: iphone怎么长截屏_新iPhone又