设为首页 收藏本站
查看: 860|回复: 1

[经验分享] 從 SQL Server 到 MariaDB - [1] 備份與還原

[复制链接]
累计签到:91 天
连续签到:1 天
发表于 2016-8-10 14:53:21 | 显示全部楼层 |阅读模式
需求說明
從 SQL Server 要轉到 MariaDB 第一件碰到管理上的轉變,就是備份與還原。
在 SQL Server 管理備份這回事,有幾個方式達成最少資料遺失的方式:
  • Full Backups 完整備份
  • Differencial Backups 差異備份
  • Transation Data Backups 交易紀錄備份
基本上這三個配合運用可達到幾乎 0 資料遺失的結果,這個在網路上應該有一大堆的說明,沒什麼太大的問題。
但是到了 MariaDB 這邊該如何處理呢?
在 MariaDB 這邊提供與 MySQL 一樣的方式,mysqldump,當然還有其他的方式,但是最熟悉的仍然是簡單的 mysqldump。
然後…就這樣。
就這樣?
是的,基本上 MariaDB 的備份還原只有 mysqldump 那樣的 Full Backups,沒有差異備份那些方式。
那要怎麼完成最少資料遺失呢? 總不能一直 Full Backup 吧?
Binary Log
MariaDB 提供一種與 MySQL 一樣的方式,稱之為 Binary Log (binlog)。
這個 binlog 是什麼呢?
簡單來說,就是紀錄著資料庫變動的紀錄,以 binary 方式儲存,有點像 Oracle DB 的 redo log,當有需要叫回備份時,首先要還原最近一次的 Full Backup,然後接著依序恢復該時間之後的 binlogs,這樣就能達到幾乎 0 資料遺失的還原。
如果是上圖的樣子,要還原的時候就是:
  • Full Backup
  • binlog_n (從 time_A 開始)
  • binlog_n+1
  • binlog_n+2
  • binlog_n+3 (到 time_B 結束)
接下來就是來做個實驗。
實驗
a. 首先開啟 binlog 功能,在 my.ini 裡可以設定,重開 mariadb 就可以開始了。
1
log_bin
這個是沒加參數的,預設會放在 %mariadb_root%\data\,詳細可以加路徑
開完裡頭應該會出現 XXX-bin.00001 字樣的檔案, XXX 是 Hostname。
b. 準備一個 database test1,裡頭一個資料表 test1 ,欄位 aaaa 為 int 。
先做一次 full backup。
1
2
3
4
E:\backup>mysqldump -u sujunmin -p test1 > test1.sql
Enter password: ************

E:\backup>
c. 新增一筆資料 1234。
d. trucnate test1.test1;
e. 來看看 binlog 裡頭有什麼東西。
1
2
3
E:\backup>mysqlbinlog "e:\MariaDB 10.1\data\WSTest-bin.000001" -v > test.sql

E:\backup>

f. test.sql 內容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#160808 14:25:16 server id 1  end_log_pos 249         Start: binlog v 4, server v 10.1.14-MariaDB created 160808 14:25:16 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG '
zCWoVw8BAAAA9QAAAPkAAAABAAQAMTAuMS4xNC1NYXJpYURCAGxvZwAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADMJahXEzgNAAgAEgAEBAQEEgAA3QAEGggAAAAICAgCAAAACgoKAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAEEwQAAK+oLro=
'/*!*/;
# at 249
#160808 14:25:16 server id 1  end_log_pos 274         Gtid list []
# at 274
#160808 14:25:16 server id 1  end_log_pos 314         Binlog checkpoint WSTest-bin.000001
# at 314
#160808 14:28:32 server id 1  end_log_pos 352         GTID 0-1-1 trans
/*!100101 SET @@session.skip_parallel_replication=0*//*!*/;
/*!100001 SET @@session.gtid_domain_id=0*//*!*/;
/*!100001 SET @@session.server_id=1*//*!*/;
/*!100001 SET @@session.gtid_seq_no=1*//*!*/;
BEGIN
/*!*/;
# at 352
#160808 14:28:32 server id 1  end_log_pos 466         Query        thread_id=3        exec_time=0        error_code=0
use `test1`/*!*/;
SET TIMESTAMP=1470637712/*!*/;
SET @@session.pseudo_thread_id=3/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1075838976/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8mb4 *//*!*/;
SET @@session.character_set_client=45,@@session.collation_connection=45,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
INSERT INTO `test1`.`test1` (`aaaa`) VALUES (1234)
/*!*/;
# at 466
#160808 14:28:32 server id 1  end_log_pos 493         Xid = 55
COMMIT/*!*/;
# at 493
#160808 14:31:19 server id 1  end_log_pos 531         GTID 0-1-2 ddl
/*!100001 SET @@session.gtid_seq_no=2*//*!*/;
# at 531
#160808 14:31:19 server id 1  end_log_pos 611         Query        thread_id=3        exec_time=14        error_code=0
SET TIMESTAMP=1470637879/*!*/;
TRUNCATE `test1`
/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

其中我們可以看到重要的兩筆資料,它們在整個時間序列的狀態為何。
1
2
3
4
5
6
7
8
9
10
11
12
13
INSERT INTO `test1`.`test1` (`aaaa`) VALUES (1234)
/*!*/;
# at 466
#160808 14:28:32 server id 1  end_log_pos 493         Xid = 55
COMMIT/*!*/;
# at 493
#160808 14:31:19 server id 1  end_log_pos 531         GTID 0-1-2 ddl
/*!100001 SET @@session.gtid_seq_no=2*//*!*/;
# at 531
#160808 14:31:19 server id 1  end_log_pos 611         Query        thread_id=3        exec_time=14        error_code=0
SET TIMESTAMP=1470637879/*!*/;
TRUNCATE `test1`
/*!*/;
g. 所以如果我們要恢復到 truncate table 之前的話,首先就是 restore full backup。
1
2
3
4
E:\backup>mysql -u sujunmin -p test1 < test1.sql
Enter password: ************

E:\backup
h. 接著還原 binlog 到 14:31:19 之前(因為接下來就要 truncate table 了)。
1
2
3
4
E:\backup>mysqlbinlog "e:\MariaDB 10.1\data\WSTest-bin.000001" --stop-datetime="2016/08/08 14:31:00" | mysql -u sujunmin -p test1
Enter password: ************

E:\backup>

i. 看一下 test1.test1,資料應該又回來了。
運用規劃
因為這個 binlog 會在系統的狀態改變(重新啟動,記憶體資料寫入 disk…)時產生,加上沒有其他的備份機制(類似像 Oracle DB 的 Archive 模式),其實當有事情時會不能知道能夠還原到哪。
所以要透過強制 rotate 與備份資料來幫忙,以下是規劃的方式。
  • 當定時的時間一到,呼叫 mysqlbinlogrotate 切斷 log。
  • 之前的 log 複製到安全的地方處理。
  • 每次 Full Backup 完 PURGE LOG


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-255832-1-1.html 上篇帖子: 真人真事改編-訂票系統問題解決實戰 下篇帖子: A Brief Introduction to SQL Server Clustering
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表