1. 程式人生 > 其它 >【筆記】第六章 利用陣列處理批量資料

【筆記】第六章 利用陣列處理批量資料

mysql備份與恢復

一,mysql日誌

1.mysql日誌型別

日誌型別與作用:
1.redo 重做日誌:達到事務一致性(每次重啟會重做)
作用:確保日誌的永續性,防止在發生故障,髒頁未寫入磁碟。重啟資料庫會進行redo log執行重做,達到事務一致性;

2.undo 回滾日誌      
作用:保證資料的原子性,記錄事務發生之前的一個版本,用於回滾,innodb事務可重複讀和讀取已提交 隔離級別就是通過mvcc+undo實現;

3.errorlog 錯誤日誌
作用:Mysql本身啟動,停止,執行期間發生的錯誤資訊;

4.slow query log 慢查詢日誌
作用:記錄執行時間過長的sql,時間閾值(10s)可以配置,只記錄執行成功
另一個作用:在於提醒優化;

5.bin log 二進位制日誌
作用:用於基於日誌形式的資料恢復,用於主從複製,實現主從同步
記錄的內容是:資料庫中執行的sql語句;

6.relay log 中繼日誌
作用:用於資料庫主從同步,將主庫發來的bin log儲存在本地,然後從庫進行回放;

7.general log 普通日誌
作用:記錄資料庫的操作明細,預設關閉,開啟後會降低資料庫效能;

2.開啟mysql日誌

vim /etc/my.cnf
[mysqld]
錯誤日誌,用來記錄當MySQL啟動、停止或執行時發生的錯誤資訊,預設已開啟
指定錯誤日誌的儲存位置和檔名
log-error=/usr/local/mysql/data/mysql_error.log

通用查詢日誌,用來記錄MySQL的所有連線和語句,預設是關閉的
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log

二進位制日誌(binlog),用來記錄所有更新了資料或者已經潛在更新了資料的語句,記錄了資料的更改,可用於資料恢復,預設已開啟
log-bin=mysql-bin
#也可以 log_bin=mysql-bin

慢查詢日誌,用來記錄所有執行時間超過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.service 

3.驗證日誌是否開啟

檢視通用查詢日誌是否開啟:
show variables like 'general%';
檢視二進位制日誌是否開啟:
show variables like 'log_bin%';
檢視慢查詢日誌相關功能:
檢視慢查詢日誌功能是否開啟:
show variables like '%slow%';
檢視慢查詢時間設定:
show variables like 'long_query_time';

二,mysql備份重要性,分類及方法

1.備份的重要性

1、備份的主要目的是災難恢復
2、在生產環境中,資料的安全性至關重要
3、任何資料的丟失都可能產生嚴重的後果

造成資料丟失的原因:
1.程式錯誤
2.人為操作錯誤
3.運算錯誤
4.磁碟故障
5.災難 (如火災、地震) 和盜竊

2.分類

1,物理備份
資料庫備份可以分為物理備份和邏輯備份。物理備份是對資料庫作業系統的物理檔案(如資料檔案、日誌檔案等)的備份。
這種型別的備份適用於在出現問題的時候需要快速恢復的大型重要資料庫。
物理備份分類:
冷備份 (離線備份) :是在關閉資料庫的時候進行的(tar)
熱備份 (聯機備份) :資料庫處於執行狀態,依賴於資料庫的日誌檔案(mysqlhotcopy mysqlbackup 第三方工具)
溫備份 :資料庫鎖定表格(不可寫入但可讀)的狀態下進行備份操(mysqldump)

2,邏輯備份
邏輯備份是對資料庫邏輯元件的備份.表示為邏輯資料庫結構
這種型別的備份適用於可以編輯資料值或表結構
從資料庫的備份策略角度來看分為:

1)完全備份
每次對資料進行完整備份,即對整個資料庫、資料庫結構和檔案結構的備份,儲存的是備份完成時刻的資料庫,
是差異備份與增量備份的基礎完全備份的備份與恢復操作都非常簡單方便,但是資料存在大量的重複並且會佔用大量的磁碟空間,備份的時間也很長

2)差異備份
備份那些自從上次完全備份之後被修改過的所有檔案,備份的時間節點是從上次完整備份起,備份資料量會越來越大。
恢復資料時只需要恢復上次的完全備份與最佳的一次差異備份
起始點:上一次完備

3)增量備份
只有那些在上次完全備份或者增量備份後被修改的檔案才會被備份,以上次完整備份或上次增量備份的時間為時間點,
僅備份期間內的資料變化,因而備份的資料量小,佔用空間小,備份速度快。
缺點:
恢復時,需要從上一次的完整備份開始到最後一次增量備份之間的所有增量依次恢復,如中間某次的備份資料損壞,將導致資料的丟失
起始點:上一次完備或增量備份

3.方法

1、物理冷備------完全備份
備份時資料庫處於關閉狀態,直接打包資料庫檔案(tar)
備份速度快,恢復時也是最簡單的
缺陷:資料的實時性較差,不能在業務正常執行時進行tar備份 -》服務停止的時候(否則可能產生資料丟失的情況)

2、專用備份工具 mysqldump 或 mysqlhotcopy 
mysqldump 常用的邏輯備份工具(mysql自帶)
mysqlhotcopy 僅擁有備份 MyISAM 和 ARCHIVE 表

3、啟用二進位制日誌進行增量備份
進行增量備份,需要重新整理二進位制日誌

4、第三方工具備份
免費的MySQL 熱備份軟體 Percona XtraBackup mysqlbackup

三,mysql完全備份與恢復

1.資料庫冷備份與恢復及完全備份與恢復

物理冷備份與恢復
systemctl stop mysqld
yum -y install xz					#xz是一個壓縮工具
#壓縮備份
tar jcvf /opt/mysql_all_$(date +%F).tar.xz /usr/local/mysql/data/
#解壓恢復
tar jxvf /opt/mysql_all_2021-02-05.tar.xz -C /usr/local/mysql/data

systemctl start mysqld

2.mysqldump備份

mysqldump 備份與恢復(溫備份)
(1)、完全備份一個或多個完整的庫 (包括其中所有的表)
mysqldump -u root -p[密碼] --databases 庫名1 [庫名2] ... > /備份路徑/備份檔名.sql    #匯出的就是資料庫指令碼檔案
例:
mysqldump -u root -p --databases SCHOOL > /opt/SCHOOL.sql       #備份一個kgc庫
mysqldump -u root -p --databases mysql SCHOOL > /opt/mysql-SCHOOL.sql    #備份mysql與 kgc兩個庫

(2)、完全備份 MySQL 伺服器中所有的庫
mysqldump -u root -p[密碼] --all-databases > /備份路徑/備份檔名.sql
例:
mysqldump -u root -p --all-databases > /opt/all.sql

(3)、完全備份指定庫中的部分表
mysqldump -u root -p[密碼] 庫名 [表名1] [表名2] ... > /備份路徑/備份檔名.sql
例:
mysqldump -u root -p [-d] SCHOOL info > /opt/SCHOOL_info.sql
#使用“-d”選項,說明只儲存資料庫的表結構
#不使用“-d"選項,說明表資料也進行備份
#做為一個表結構模板

(4)檢視備份檔案
grep -v "^--" /opt/SCHOOL_info.sql | grep -v "^/" | grep -v "^$"



3.mysql完全恢復

1、恢復資料庫
#“-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;'
2、恢復資料表
當備份檔案中只包含表的備份,而不包含建立的庫的語句時,執行匯入操作時必須指定庫名,且目標庫必須存在。
mysql -u root -p -e 'drop table SCHOOL.info;'
mysql -u root -p -e 'show tables from SCHOOL;'
mysql -u root -p SCHOOL < /opt/SCHOOL_info.sql
mysql -u root -p -e 'show tables from SCHOOL;'

四,mysql增量備份與恢復

1.mysql增量備份

1、開啟二進位制日誌功能
vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin
server-id = 1
binlog_format = MIXED				#指定二進位制日誌(binlog)的記錄格式為 MIXED

#二進位制日誌(binlog)有3種不同的記錄格式:STATEMENT(基於SQL語句)、ROW(基於行)、MIXED(混合模式),預設格式是STATEMENT

systemctl restart mysqld.service
ls -l /usr/local/mysql/data/mysql-bin.*

2.對資料庫進行完全備份

這種定時任務可以結合crontab -e 計劃性任務來執行
#手動執行備份
mysqldump -u root -p SCHOOL info > /opt/SCHOOL_info_$(date +%F).sql
mysqldump -u root -p --all-databases > /opt/allmysql_$(date +%F).sql

#使用crontab -e 計劃性任務來執行;每週1凌晨2點對錶info和所有的庫進行備份
0 2 * * 1 mysqldump -u root -p SCHOOL info > /opt/SCHOOL_info_$(date +%F).sql
0 2 * * 1 mysqldump -u root -p --all-databases > /opt/allmysql_$(date +%F).sql

3.檢視二進位制日誌檔案的內容

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:顯示詳細內容

4.可每天進行增量備份操作,生成新的二進位制日誌檔案

mysqladmin -u root -p flush-logs
ll /usr/local/mysql/data/
插入新資料:
insert into info values (3,'C',1000);
insert into info values (4,'D',900);
select * from info;
檢視新生成的二進位制檔案:
mysqladmin -u root -p flush-logs
ll /usr/local/mysql/data/



4.mysql增量恢復

1.一般恢復

模擬丟失更改的資料的恢復步驟:
刪除表中資料,基於bin.000002日誌進行恢復;
delete from info where id=3;
delete from info where id=4;
select * from info;
mysqlbinlog --no-defaults /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p
mysql -u root -p -e "select * from SCHOOL.info;"


模擬丟失所有資料的恢復步驟:
刪除表,匯入增量備份檔案,基於二進位制檔案恢復

mysql -u root -p SCHOOL < /opt/SCHOOL_info_2022-04-10.sql
mysqlbinlog --no-defaults /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p
mysql -u root -p -e "select * from SCHOOL.info;"

2.斷點恢復

1.基於位置恢復

僅恢復位置點302之前的資料:
mysql -u root -p SCHOOL < /opt/SCHOOL_info_2022-04-10.sql
mysql -u root -p -e "select * from SCHOOL.info;"
mysqlbinlog --no-defaults --stop-position='302' /opt/mysql-bin.000002 | mysql -uroot -p
mysql -u root -p -e "select * from SCHOOL.info;"

僅恢復id=6的資料,跳過id=5的資料
mysql -u root -p SCHOOL < /opt/SCHOOL_info_2022-04-10.sql
mysql -u root -p -e "select * from SCHOOL.info;"
mysqlbinlog --no-defaults --start-position='595' /opt/mysql-bin.000002 | mysql -uroot -p
mysql -u root -p -e "select * from SCHOOL.info;"

2.基於時間點恢復

僅恢復時間220410 21:32:12之前的資料:
mysql -u root -p SCHOOL < /opt/SCHOOL_info_2022-04-10.sql 
mysql -u root -p -e "select * from SCHOOL.info;"
mysqlbinlog --no-defaults --stop-datetime='22-04-10 21:32:12' /opt/mysql-bin.000002 | mysql -uroot -p
mysql -u root -p -e "select * from SCHOOL.info;"

僅恢復id為6 ,跳過id為5 的資料:
mysql -u root -p SCHOOL < /opt/SCHOOL_info_2022-04-10.sql
mysql -u root -p -e "select * from SCHOOL.info;"
mysqlbinlog --no-defaults --start-datetime='22-04-10 21:32:19' /opt/mysql-bin.000002 | mysql -uroot -p
mysql -u root -p -e "select * from SCHOOL.info;"