本文目錄一覽:
mysql數據庫怎麼備份數據庫
1、備份一個數據庫
mysqldump基本語法:
mysqldump -u username -p dbname table1 table2 …- BackupName.sql
2、直接複製整個數據庫目錄MySQL有一種非常簡單的備份方法,就是將MySQL中的數據庫文件直接複製出來。這是最簡單,速度最快的方法。
3、使用mysqlhotcopy工具快速備份
mysql到底如何備份
數據備份是數據容災的最後一道防線,即便有着兩地三中心的架構,備份也依然重要。如果備份出問題,備份時影響了交易業務,備份數據無法恢復,這些也是企業難以承受的。所以選擇合適的備份工具尤為重要。
每個企業級數據庫都會有配套的備份工具,MEB(MySQL Enterprise Backup)就是MySQL企業版中非常重要的工具之一,是為企業級客戶提供的數據備份方案。
Xtrabackup一直作為MEB 開源版備胎而存在,從MySQL 8.0開始情況可能會變得有所不同。
在 MySQL 8.0的Backup Lock、Redo Log Archiving、Page Tracking等新特性的加持下,MEB備份/恢復體驗會更好,目前xtrabackup還不支持這些特性。
MySQL 企業版還有哪些功能?
特性1:Backup Lock
8.0之前使用xtrabackup或MEB做物理備份,為了保證備份時InnoDB引擎表與其他引擎數據文件、及binlog日誌的一致性會上全局讀鎖,再拷貝非InnoDB文件,這期間MySQL會變成只讀,數據無法寫入。表數量越多,可能加上時間越長,如果使用的xtrabackup 不小心沒加rsync參數,逐個拷貝frm文件,鎖定時間會更長,對業務影響較大。
我曾遇到過部署在虛擬機的實例有12000多張表,當時使用的xtrabackup,備份腳本中沒加rsync參數,結果鎖了十幾分鐘,而MEB就沒有這樣的問題。
MySQL 8.0支持輕量級備份鎖 LOCK INSTANCE FOR BACKUP,數據字典也重構了由InnoDB存儲。若不創建非InnoDB表,MEB默認使用備份鎖獲取binlog日誌一致性位置,並阻止DDL操作,但不影響DML操作。
只有InnoDB表,僅上備份鎖
請點擊輸入圖片描述
若有非InnoDB表,上全局鎖
請點擊輸入圖片描述
特性2:Redo Log Archiving
MEB能做到在線熱備,備份時不影響數據庫讀寫,這是利用了InnoDB事務日誌,在備份期間持續監視redo log的變化,讀取增量變化,寫入到ibbackup_logfile,也就不需要上鎖來保障備份一致性。(對非InnoDB的文件需要上讀鎖拷貝)
如果備份期間數據庫寫入負載特別大,而寫入ibbackup_logfile速度較慢,redo log size也不大,很可能會出現ibbackup_logfile的寫入速度跟不上redo log記錄生成速度,redo log 空間不夠時需要覆寫日誌文件,那麼來不及寫入ibbackup_logfile的記錄會丟失,導致備份失敗。
MEB 4.1對此做了優化,將redo log處理線程拆分成多線程分工合作,提高處理redo log的效率,降低了redo log覆寫造成備份失敗的概率,但redo log新增速度和ibbackup_logfile寫入速度懸殊太大,問題依然會發生。
MySQL 8.0.17支持了redo log archiving 徹底解決了此問題,備份前設置innodb_redo_log_archive_dirs,指定redo log歸檔目錄。MEB備份時自動開啟日誌歸檔,當checkpoint時會將舊記錄歸檔到此目錄,後續從歸檔文件中讀取redo日誌記錄,避免了覆寫可能導致的redo記錄丟失。
請點擊輸入圖片描述
注意:innodb_redo_log_archive_dirs 不能在數據目錄下,目錄權限要求是700
特性3:Page Tracking
Page Tracking 是為優化增量備份效率,減少不必要的數據頁掃描。
增量備份當前有3種掃描模式:
page-track:利用LSN精確跟蹤上次備份之後被修改頁面,僅複製這些頁面,效率最快。
optimistic:掃描上次備份之後被修改的InnoDB 數據文件中,找出並拷貝修改的頁面。依賴系統時間,使用存在限制。
full-scan:掃描所有InnoDB數據文件,找出並拷貝自上次備份之後修改的頁面,效率最慢
1、利用page-track增量備份,需先安裝備份組件
mysql INSTALL COMPONENT “”;
2、在全備前開啟page-track
SELECT mysqlbackup_page_track_set(true);
3、全備之後,做增量備份時指定若滿足page tracking條件,默認會使用page-track模式,否則會使用full-scan模式,也可以指定–incremental=page-track。
mysqlbackup –incremental-backup-dir=backup_incr –trace=3 –incremental=page-track –incremental-base=history:last_full_backup backup
incremental-base有3種選擇
last_backup:基於前一次備份做增備,前一次備份可能是增備,也可能是全備。這種方式全備之間可能會有多個增備,每次增量可能比較小,但恢復時需要逐個合併。
last_full_backup:基於前一次全備做增備。這種方式增備會越往後體積可能越大,但恢復時只需要合併最後一次增量備份。
dir:基於前一次的備份目錄,前一次備份可能是增備,也可能是全備。
測試對比full-scan 和page-track ,在變更頁小於總體50%的情況下 ,備份效率至少能有1倍的速度提升。
page-track 模式 磁盤讀寫均衡,說明讀寫的都是修改頁面。
請點擊輸入圖片描述
full-scan模式 磁盤讀寫差別很大,說明讀了很多未修改的頁面。
請點擊輸入圖片描述
MySQL的備份與還原,非常規備份,全量備份,增量備份
1:官方百萬級別的測試數據庫:
官方測試數據庫github網址:
下載到目錄,解壓即可,運行命令:
2:自己創建簡單測試數據庫:
快速隨機生成測試語言的網站:
選擇sql和想生成的字段,點擊生成Generate!生成即可。
在MySQL輸入生成的語句即可。
3:測試備份還原時用到的命令
刪庫跑路測試(先備份好)
還原後查詢庫的表數據是否完整。
採用複製整個數據存放目錄
1:查看數據庫數據存放位置
有兩種方法:
1):在數據庫中用命令 show variables like ‘datadir’; 查看
2):在配置文件中查看,配置了 datadir 目錄的可查看。沒有配置的默認為 /var/lib/mysql/ 位置
Linux中查看配置文件
2:複製目錄或者目錄下某個數據庫名
3:還原時直接複製文件夾到數據庫目錄即可
mysqldump又可叫做全量備份。
參數 –databases 同 -B ,單獨一個庫,也可省略。
1、備份命令mysqldump格式
格式:mysqldump -h主機名 -P端口 -u用戶名 -p密碼 database 數據庫名 文件名.sql
備份testDatabase數據庫
2、備份MySQL數據庫為帶刪除表的格式
備份MySQL數據庫為帶刪除表的格式,能夠讓該備份覆蓋已有數據庫而不需要手動刪除原有數據庫。
3、直接將MySQL數據庫壓縮備份
備份並壓縮
4、備份MySQL數據庫某個(些)表
備份testDatabase中的myTable表,不需要用參數 –databases 或者 -B
5、同時備份多個MySQL數據庫
同時備份testDatabase和 employees兩個庫
6、備份服務器上所有數據庫
參數 –all-databases 同 -A
7、還原MySQL數據庫的命令
1) 不指定數據名還原,默認生成原數據庫名稱,還原所有數據庫。
2) 指定數據名還原,還原指定單個數據庫,需在數據庫種預先創建一個testDatabase名稱。
3) 還原壓縮的MySQL數據庫
4) 進入數據庫用source導入
增量備份是針對於數據庫的bin-log日誌進行備份的,增量備份是在全量的基礎上進行操作的。增量備份主要是靠mysql記錄的bin-log日誌。
1:查看是否開啟bin-log日誌
進入mysql輸入命令可查看。
顯示如下為開啟狀態,日誌文件在/var/lib/mysql/以binlog.00001的格式保存。
如未開啟,需要在配置文件種配置
2:查看目前使用的bin-log日誌文件
進入mysql查看命令。
顯示如下,目前使用的是binlog.000022文件,所有操作都記錄在此文件。
查看當前testDatabase的表myTable數據如下,
3:刷新日誌,使用新的日誌文件(備份)
在命令端執行命令
日誌文件從 binlog.000022 變為 binlog.000023
這時相當與已經備份成功,備份文件即為上次的binlog.000022日誌文件。
4:刪除數量,從日誌還原數據
1) 刪除ABC行
查詢以及沒有ABC行列。
2) 恢複數據ABC行
退出mysql,在命令端用mysqlbinlog命令恢復到binlog.000022日誌狀態。
進入數據庫再次查看數據,ABC已經恢復。
增量備份完成。
如何備份MYSQL數據庫?
定期的備份可使我們數據庫崩潰造成的損失大大降低。在MySQL中進行數據備份的方法有兩種,一種是使用mysqldump程序,一種是使用mysqlhotcopy、cp、tar或cpio等打包程序直接拷貝數據庫文件。mysqldump程序備份數據庫較慢,但它生成的文本文件便於移植。使用mysqlhotcopy等程序備份速度快,因為它直接對系統文件進行操作,需人為協調數據庫數據的備份前後一致性。
使用mysqldump備份數據庫其實就是把數據庫轉儲成一系列CREATE TABLE和INSERT語句,通過這些語句我們就可重新生成數據庫。使用mysqldump的方法如下:
% mysqldump –opt testdb | gzip /data/backup/testdb.bak
#–opt選項會對轉儲過程進行優化,生成的備份文件會小一點,後的管道操作會進行數據壓縮
% mysqldump –opt testdb mytable1,mytable2 | gzip /data/backup/testdb_mytable.bak
#可在數據庫後接數據表名,只導出指定的數據表,多個數據表可用逗號分隔
–opt選項還可激活–add-drop-table選項,它將會在備份文件的每條CREATE TABLE前加上一條DROP TABLE IF EXISTS語句。這可方便進行數據表的更新,而不會發生“數據表已存在”的錯誤。
用mysqldump命令還可直接把數據庫轉移到另外一台服務器上,不用生成備份文件。重複執行可定期更新遠程數據庫。
% mysqladmin -h remote_host create testdb
% mysqldump –opt testdb | mysql -h remote_host testdb
另外還可通過ssh遠程調用服務器上的程序,如:
% ssh remote_host mysqladmin create testdb
% mysqldump –opt testdb | ssh remote_host mysql testdb
通過直接拷貝系統文件的方式備份數據庫,在備份時,要確保沒有人對數據庫進行修改操作。要做到這點,最好關閉服務器。如果不能關閉的,要以只讀方試鎖定有關數據表。下面是一些示例:
% cp -r db /backup/db #備份db數據庫到/backup/db目錄
% cp table_name.* /backup/db #只備份table_name數據表
% scp -r db remotehot:/usr/local/mysql/data #用scp把數據庫直接拷貝到遠程服務器
在把數據庫直接拷貝到遠程主機時,應注意兩台機器必須有同樣的硬件結構,或者將拷貝的數據表全部是可移植數據表類型。
使用mysqlhotcopy工具,它是一個Perl DBI腳本,可在不關閉服務器的情況下備份數據庫,它主要的優點是:
它直接拷貝文件,所以它比mysqldump快。
可自動完成數據鎖定工作,備份時不用關閉服務器。
能刷新日誌,使備份文件和日誌文件的檢查點能保持同步。
下面是該工具的使用示例:
% mysqlhotcopy db /bakcup/ #把db數據庫備份到backup/db目錄里,會自動創建一個db目錄
使用BACKUP TABLE語句進行備份,該語句最早出現在MySQL 3.23.25版本中,僅適用於MyISAM數據表。用法如下:
mysql BACKUP TABLE mytable TO ‘/backup/db’; #把mytable數據表備份到/backup/db目錄下
為了執行該語句,你必須擁有那些表的FILE權限和SELECT權限,備份目錄還必須是服務器可寫的。該語句執行時,會先把內存中的數據寫入磁盤,再把各個數據表的.frm(表結構定義文件)、.MYD(數據)文件從數據目錄拷貝到備份目錄。它不拷貝.MYI(索引)文件,因為它能用另外兩個文件重建。BACKUP TABLE語句備份時,依次鎖定數據表,當同時備份多個數據表時,數據表可能會被修改,所以備份0完成時,備份文件中的數據和現時數據表中的數據可能會有差異,為了消除該差異,我們可用只讀方式鎖定數據表,在備份完成後再解鎖。如:
mysql LOCK TABLES tb1 READ,tb2 READ;
mysql BACKUP TABLE tb1,tb2 TO ‘backup/db’;
mysql UNLOCK TABLE
mysql數據庫如何備份?
MySQL數據庫備份與還原
備份和恢複數據
生成SQL腳本
在控制台使用mysqldump命令可以用來生成指定數據庫的腳本文本,但要注意,腳本文本中只包含數據庫的內容,而不會存在創建數據庫的語句!所以在恢複數據時,還需要自已手動創建一個數據庫之後再去恢複數據。
mysqldump –u用戶名 –p密碼 數據庫名生成的腳本文件路徑
現在可以在C盤下找到mydb1.sql文件了!
注意,mysqldump命令是在Windows控制台下執行,無需登錄mysql!!!
執行SQL腳本
執行SQL腳本需要登錄mysql,然後進入指定數據庫,才可以執行SQL腳本!!!
執行SQL腳本不只是用來恢複數據庫,也可以在平時編寫SQL腳本,然後使用執行SQL 腳本來操作數據庫!大家都知道,在黑屏下編寫SQL語句時,就算髮現了錯誤,可能也不能修改了。所以我建議大家使用腳本文件來編寫SQL代碼,然後執行之!
SOURCE C:\mydb1.sql
注意,在執行腳本時需要先行核查當前數據庫中的表是否與腳本文件中的語句有衝突!例如在腳本文件中存在create table a的語句,而當前數據庫中已經存在了a表,那麼就會出錯!
還可以通過下面的方式來執行腳本文件:
mysql -uroot -p123 mydb1c:\mydb1.sql
mysql –u用戶名 –p密碼 數據庫要執行腳本文件路徑
這種方式無需登錄mysql!
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/185872.html