數據庫遷移
前言
數據庫遷移有啥好記錄的, 一句話搞就完了.
操蛋在于, 項目沒有實際開發測試完,但是需要先寫發版步驟.
場景:
平常開發服務器A, 要給客戶定制化部署一份B. A的表結構等信息還沒有完全確定, 開發中可能存在變動, 如何寫發版遷移步驟呢?
mysql:
方案1(navicat視圖化工具):
navicat 通過數據庫連接工具直接遷移.
工具-> 結構同步/數據同步. 選擇源和目標之后執行.
-
優點:
鏈接簡單, 所見即所得
-
缺點:
不容易描述, 要么截圖讓運維按照截圖操作, 要么現場指導, 各種點擊選擇容易出錯.
比如我只遷移某個庫中的某個表的數據, 操作上可能要找到表再勾選, 比較難找.
方案2(mysqldump):
示例:
僅導出結構
mysqldump -u賬號 -p密碼 -hIP地址 -d -B 數據庫1 數據2 數據庫3 > 導出的建庫語句.sql
導出數據
mysqldump -u賬號 -p密碼 -hIP地址 數據庫 表1 表2 表3> 導出數據執行語句.sql
-u 賬號
-p 密碼
-h 數據庫
--where 查詢語句
有了sql怎么寫到新庫, 這個就不贅述了.
mysql -u賬號 -p密碼 -hIP地址 --database=數據庫1 -e"要手動執行的sql語句"
mysql -u賬號 -p密碼 -hIP地址 --database=數據庫1 < 要導入的sql文件.sql
-
優點:
不會出錯,傻瓜式操作,不會因為誤點擊導致數據出錯.
-
缺點:
需要拼接賬號密碼ip地址才能操作, 落了下乘.
mongoDB
眾所周知, mongoDB,無需建表語句, 動態創建表, 所以沒有啥結構遷移?
嗯? 怎么可能沒有結構遷移, 還有索引遷移呢!
索引導出(js腳本):
var collectionList = db.getCollectionNames();
for(var index in collectionList){
var collection = collectionList[index];
var cur = db.getCollection(collection).getIndexes();
if(cur.length == 1){
continue;
}
for(var index1 in cur){
var next = cur[index1];
//print(JSON.stringify(next))
if(next["key"]["_id"] == '1'){
continue;
}
print("try{ db.getCollection(\""+collection+"\").ensureIndex("+JSON.stringify(next.key)+",{background:1, unique:" + (next.unique || false) + "" + (next.expireAfterSeconds > 0 ? ", expireAfterSeconds :" + next.expireAfterSeconds : "") + " })}catch(e){print(e)}")
}
}
數據導入導出
示例導出:
mongoexport -h 127.0.0.1 --port 20000 -d chargerlink -c t_wallet_card_reset_record --file 123.json --query='{"reset_time":{$gte:1561392000000}}'
-h 地址
-port 端口
-d 數據庫名稱
-c 表名稱
--type 導出數據類型,
-o 導出數據存儲位置
--query 檢索條件
導入:
mongoimport -h 127.0.0.1 --port 20000 -d mamcharge -c unionUser --file 123.json
-h 地址
-port 端口
-d 數據庫名稱
-c 表名稱
-file 導入數據存儲位置
給別人讓別人錄入采用export導出文件,copy給對方,給對方寫好import語句,
自己執行當然采用mongodump了, 方便.
備份示例:
mongodump --host 172.16.1.185 --port 27017 -u mamcharge -p hlBAPwR2DG -d mamcharge -c conf_alarm_definition
參數說明:
--host:MongoDB所在服務器IP。
--port:MongoDB所在服務器端口。
-d:需要備份的數據庫實例。
-o:備份的數據存放位置。
-u : 指定登錄用戶
-p : 指定登錄用戶的密碼
-c : 指定要備份的集合
浙公網安備 33010602011771號