在工作中需要把MySQL環(huán)境某一個庫里一個表復制一份,故整理記錄方法如下:復制整個表create table new_table select * from old_table;
創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站設(shè)計、網(wǎng)站制作、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)瑪納斯,10余年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):13518219792
復制表,不復制數(shù)據(jù)create table new_table select * from old_table where 0;
主鍵,索引,自增等其他額外特征不會被帶到新表中。這點和其他的數(shù)據(jù)庫產(chǎn)品類似。
如果從庫上表 t 數(shù)據(jù)與主庫不一致,導致復制錯誤,整個庫的數(shù)據(jù)量很大,重做從庫很慢,如何單獨恢復這張表的數(shù)據(jù)?通常認為是不能修復單表數(shù)據(jù)的,因為涉及到各表狀態(tài)不一致的問題。下面就列舉備份單表恢復到從庫會面臨的問題以及解決辦法:
場景 1
如果復制報錯后,沒有使用跳過錯誤、復制過濾等方法修復主從復制。主庫數(shù)據(jù)一直在更新,從庫數(shù)據(jù)停滯在報錯狀態(tài)(假設(shè) GTID 為 aaaa:1-100)。
修復步驟:
在主庫上備份表 t (假設(shè)備份快照 GTID 為 aaaa:1-10000);
恢復到從庫;
啟動復制。
這里的問題是復制起始位點是 aaaa:101,從庫上表 t 的數(shù)據(jù)狀態(tài)是領(lǐng)先其他表的。aaaa:101-10000 這些事務(wù)中只要有修改表 t 數(shù)據(jù)的事務(wù),就會導致復制報錯 ,比如主鍵沖突、記錄不存在(而 aaaa:101 這個之前復制報錯的事務(wù)必定是修改表 t 的事務(wù))
解決辦法:啟動復制時跳過 aaaa:101-10000 這些事務(wù)中修改表 t 的事務(wù)。
正確的修復步驟:
1. 在主庫上備份表 t (假設(shè)備份快照 GTID 為 aaaa:1-10000),恢復到從庫;
2. 設(shè)置復制過濾,過濾表 t:
CHANGE REPLICATION FILTER REPLICATE_WILD_IGNORE_TABLE = ('db_name.t');
3. 啟動復制,回放到 aaaa:10000 時停止復制(此時從庫上所有表的數(shù)據(jù)都在同一狀態(tài),是一致的);
START SLAVE UNTIL SQL_AFTER_GTIDS = 'aaaa:10000';
4. 刪除復制過濾,正常啟動復制。
注意事項:這里要用 mysqldump --single-transaction --master-data=2,記錄備份快照對應的 GTID
場景 2
如果復制報錯后,使用跳過錯誤、復制過濾等辦法修復了主從復制。主、從庫數(shù)據(jù)一直在更新。
修復步驟:
在主庫上備份表 t (假設(shè)備份快照 GTID為 aaaa:1-10000);
停止從庫復制,GTID為 aaaa:1-20000;
恢復表 t 到從庫;
啟動復制。
這里的問題是復制起始位點是 aaaa:20001,aaaa:10000-20000 這些事務(wù)將不會在從庫上回放,如果這里面有修改表 t 數(shù)據(jù)的事務(wù),從庫上將丟失這部分數(shù)據(jù)。
解決辦法:從備份開始到啟動復制,鎖定表 t,保證 aaaa:10000-20000 中沒有修改表 t 的事務(wù)。
正確修復步驟:
對表 t 加讀鎖;
在主庫上備份表 t;
停止從庫復制,恢復表 t;
啟動復制;
解鎖表 t。
如果是大表,這里可以用可傳輸表空間方式備份、恢復表,減少鎖表時間。
基于之前的文章方法,加入批處理命令即可實現(xiàn)自動備份。只是由于批處理命令中對于備份文件的名字按照時間命名比較特別,所以特別整理一文。
1、復制date文件夾備份
============================
假想環(huán)境:
MySQL 安裝位置:C:\MySQL
論壇數(shù)據(jù)庫名稱為:bbs
數(shù)據(jù)庫備份目的地:C:\db_bak\
============================
新建db_bak.bat,寫入以下代碼
*******************************Code Start*****************************
net stop mysql
xcopy c:\mysql\data\bbs\*.* c:\db_bak\bbs\%date:~0,10%\ /S /I
net start mysql
*******************************Code End *****************************
然后使用Windows的“計劃任務(wù)”定時執(zhí)行該批處理腳本即可。(例如:每天凌晨3點執(zhí)行back_db.bat)
解
釋:備份和恢復的操作都比較簡單,完整性比較高,控制備份周期比較靈活,例如,用%date:~0,10%。此方法適合有獨立主機但對mysql沒有管理
經(jīng)驗的用戶。缺點是占用空間比較多,備份期間mysql會短時間斷開(例如:針對30M左右的數(shù)據(jù)庫耗時5s左右),針對%date:~0,10%的用法
參考 。
2、mysqldump備份成sql文件
==============
假想環(huán)境:
MySQL 安裝位置:C:\MySQL
論壇數(shù)據(jù)庫名稱為:bbs
MySQL root 密碼:123456
數(shù)據(jù)庫備份目的地:D:\db_backup\
腳本:
rem *******************************Code Start*****************************
@echo off
set "Ymd=%date:~,4%%date:~5,2%%date:~8,2%"
C:\MySQL\bin\mysqldump --opt -u root --password=123456 bbs D:\db_backup\bbs_%Ymd%.sql
@echo on
rem *******************************Code End*****************************
將以上代碼保存為backup_db.bat
然后使用Windows的“計劃任務(wù)”定時執(zhí)行該腳本即可。(例如:每天凌晨5點執(zhí)行back_db.bat)
說明:此方法可以不用關(guān)閉數(shù)據(jù)庫,并且可以按每一天的時間來名稱備份文件。
通過%date:~5,2%來組合得出當前日期,組合的效果為yyyymmdd,date命令得到的日期格式默認為yyyy-mm-dd(如果不是此格式可以通過pause命令來暫停命令行窗口看通過%date:~,20%得到的當前計算機日期格式),所以通過%date:~5,2%即可得到日期中的第五個字符開始的兩個字符,例如今天為2009-02-05,通過%date:~5,2%則可以得到02。(日期的字符串的下標是從0開始的)
3、利用WinRAR對MySQL數(shù)據(jù)庫進行定時備份。
對于MySQL的備份,最好的方法就是直接備份MySQL數(shù)據(jù)庫的Data目錄。下面提供了一個利用WinRAR來對Data目錄進行定時備份的方法。
首先當然要把WinRAR安裝到計算機上。
將下面的命令寫入到一個文本文件里
*******************************Code Start*****************************
net stop mysql
c:\progra~1\winrar\winrar a -ag -k -r -s d:\mysql.rar d:\mysql\data
net start mysql
*******************************Code End*****************************
保存,然后將文本文件的擴展名修改成CMD。進入控制面版,打開計劃任務(wù),雙擊“添加計劃任務(wù)”。在計劃任務(wù)向?qū)е姓业絼偛诺腃MD文件,接著為這個任務(wù)指定一個運行時間和運行時使用的賬號密碼就可以了。
這種方法缺點是占用時間比較多,備份期間壓縮需要時間,mysql斷開比第一種方法更多的時間,但是對于文件命名很好。