如何用C++介面備份MySQL的二進位數據?
01-15
最近使用MySQL遇到一個問題, 問題描述有點長, 整理如下=_=:
MySQLdump已經可以實現備份, 看了它執行的general log, 認為基本上就是select, 然後根據讀到的數據, 構建insert SQL語句. 但是很好奇對於varbinary類型的數據要怎麼辦. 直接用sprintf(%s)寫文件?我做了如下的測試:首先, 一個表裡面有varbinary數據, 直接用MySQL的CLI獲取數據, client的編碼設為utf-8, 結果如下:方法一: 方法二: dump.sql使用Mysqldump 進行邏輯備份, 保存到dump.sql裡面, 用--default-character-set=utf8選項, 得到文件用sublime的utf-8打開.有如下結果: 用vim打開, 得到如下結果:(encoding 為utf-8, fileencoding為latin1)
方法三:sprintf用C介面以char*的形式讀取二進位數據, 用sprintf(%s)的方式寫入文件. 打開以後結果如下:我的疑問主要如下:1. Mysqldump做了什麼, 導致同樣是utf-8, 從dump.sql文件看到的內容和直接用MySQL的CLI讀取的內容不一樣?(雖然二進位無法理解, 但應該長一樣才對)
2. 同樣的內容, 同樣用utf-8解析, 為什麼vim和subllime顯示不一樣?3. 對於二進位的備份, 和自己直接用sprintf的%s寫文件相比, 可以看到Mysqldump 在某些"?"字元前面插入了 "/", 為什麼要這麼做? 4. Mysqldump為這個欄位的數據添加了 " ", 這種情況下, 在二進位的內部如果恰好有字元為 " , 是否會產生錯誤?5. %s寫文件如果遇到 等會終止, 如何寫文件, 才能夠與Mysqldump的行為保持一至,從而實現自己讀取varbinary數據, 備份到一個文本文件, 並可以直接做數據恢復?感謝回答以上任意一個問題, THX!
答案很簡單,不要備份成文本文件。根本沒有人這麼做的。再說了,備份就是資料庫的必備功能,你直接調用它的API給dump到另一個資料庫(譬如說某些資料庫會保存成*.db),就好了。不要想著自己複製出來。你自己寫程序複製東西出來,你schema複製了嗎?你index複製了嗎?各種屬性和stored procedure複製了嗎?用戶的許可權複製了嗎?你這樣做是無法追上資料庫的升級的。
Dumping and importing from/to MySQL in an UTF-8 safe way
你要是非要導出為文本格式,這個鏈接及其相關內容大概能幫你。
應該導出成二進位文件,可以看這個庫的測試例子:
znone/qtl: A lightweight C++ database library for MySQL and SQLite
一個實現的方式是以十六進位方式轉換二進位內容,以字元串的形式保存在文件,插入的時候直接以十六進位的插入。
Alibaba canal也許是很好的選擇
推薦閱讀:
※附近的人怎麼計算出來的?
※Stata 中文字元顯示成問號,該怎麼解決?
※mysql,zk這些強一致性的軟體為什麼要先寫日誌?
※SQL Server 相比 MySQL 有何優勢?
※請問這個PHP下防範MySQL注入攻擊的方法管用嗎?