- 論壇徽章:
- 0
|
技術(shù)背景:
項目中,由于數(shù)據(jù)量很大,整個系統(tǒng)架構(gòu)自身來實現(xiàn)"分區(qū)表", 基礎(chǔ)數(shù)據(jù)系列表每天都生成一套表,而各類基礎(chǔ)表創(chuàng)建,視圖關(guān)系映射,
過期數(shù)據(jù)和表的清除都依賴于數(shù)據(jù)庫的調(diào)度分別放在早上1點和3點運行,因為項目存在兩個版本oracle 和MySQL, 前者依賴于oracle jobs, 后者依賴于
MySQL Event Scheduler. 對于MySQL版本的架構(gòu)采用的是主從架構(gòu),而Event在MySQL Replication的過程中遇到一些小問題。
問題列表:
1, 注意當在slave不創(chuàng)建Event,但是如果Master 上的event時間到了,它們自動刪除,而這個刪除操作也會被記錄到binlog中,
這樣slave會出現(xiàn)錯誤,因為它不存在這個events. 如果手動刪除events,則加上SET sql_log_bin =0;
2, Event本身的schedule的設(shè)置,最好用字符串來表示時間,如果用now(),如果是兩臺server的時區(qū)不相同,那樣就糾結(jié)了。
3, Event在Replication中的運行策略,因為Event在Master上作的修改會被復制到Slave上,如果Slave 的Event再運行,這就會出問題的, 的有以下3種情況
3.1 要運行的Event只在Master上創(chuàng)建,這種情況如果把slave提升為master時,要創(chuàng)建event.
3.1.1 : 用set sql_log_bin=0, 這樣創(chuàng)建event的sql就不會被記錄到binlog中,不過,這樣對于以后恢復有影響,所以這樣做后,最好做個全備。
3.1.2 : event會在slave上創(chuàng)建,但馬上將其drop掉。有點笨的方法
3.2 直接禁用Slave上的event, 在my.cnf配置 event_scheduler=0; 但是整個mysql 實例都不能運行event. 因為滿足要求,我們項目就用的這個。
提升slave時,也方便,直接set global event_scheduler=ON便可,同時修改my.cnf.
3.3 Event提供了一機制,創(chuàng)建的時候可以設(shè)置DISABLE ON SALVE, 其實這個值是默認,當我們用在slave上用show events查看時,在
Slave字段上顯示的是DISABLE ON SALVE, 但是在Master上顯示還是ENABLE。提升Slave為Master的時候,只要修改狀態(tài)就可以了
后面會做測試!緜人覺得這種方式最優(yōu)】
示例:演示上面3.3的處理方法
1 演示Master創(chuàng)建event, 同時Slave也會創(chuàng)建,但默認狀態(tài)是DISABLE ON SALVE,所以Slave的event是不會執(zhí)行的。
1.1 確認Master和Slave的event_scheduler=ON, 如果不是可執(zhí)行set global event_scheduler =ON;
mysql> show variables like 'event_scheduler';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| event_scheduler | ON |
+-----------------+-------+
1 row in set (0.00 sec)
2 在測試數(shù)據(jù)庫test中(可復制), 在Master上創(chuàng)建測試表test.t_event, 測試存儲過程p_event.
在Master創(chuàng)建一個event: e_replication,用于調(diào)用p_event, 每次向t_event表中插入一條數(shù)據(jù)。
測試說明:如果Master和Slave的t_event表中的數(shù)據(jù)行數(shù)相同,則說明只有maser的event運行,slave的event沒有運行。
2.1.1 創(chuàng)建event, 每一分鐘執(zhí)行一次event, 也就是每一分鐘向t_event插入一數(shù)據(jù)
mysql> CREATE EVENT `e_replication` ON SCHEDULE EVERY 1 MINUTE STARTS sysdate() + interval 2 minute DO call p_events();
Query OK, 0 rows affected (0.00 sec)
2.1.2 查看Master上的e_replication創(chuàng)建情況, 可見已成功,且Status是ENABLED
mysql> show events\G
*************************** 1. row ***************************
Db: test
Name: e_replication
Definer: root@localhost
Time zone: SYSTEM
Type: RECURRING
Execute at: NULL
Interval value: 1
Interval field: MINUTE
Starts: 2012-04-10 11:25:38
Ends: NULL
Status: ENABLED
1 row in set (0.00 sec)
2.1.3 查看Slave上的Event也因復制,創(chuàng)建成功,且狀態(tài)Status是SLAVESIDE_DISABLED,說明默認不運行此Event.
mysql> show events\G
*************************** 1. row ***************************
Db: test
Name: e_replication
Definer: root@localhost
Time zone: SYSTEM
Type: RECURRING
Execute at: NULL
Interval value: 1
Interval field: MINUTE
Starts: 2012-04-10 11:25:39
Ends: NULL
Status: SLAVESIDE_DISABLED
1 row in set (0.00 sec)
2.1.4 檢測master和slave上的t_event是一樣的,說明正常復制,且slave上的event沒有運行,符合我們要求。
mysql> select * from t_event;
+----+---------------------+
| id | time |
+----+---------------------+
| 44 | 2012-04-10 11:25:38 |
| 45 | 2012-04-10 11:26:38 |
| 46 | 2012-04-10 11:27:38 |
| 47 | 2012-04-10 11:28:39 |
| 48 | 2012-04-10 11:29:38 |
+----+---------------------+
5 rows in set (0.00 sec)
mysql> select * from t_event;
+----+---------------------+
| id | time |
+----+---------------------+
| 44 | 2012-04-10 11:25:38 |
| 45 | 2012-04-10 11:26:38 |
| 46 | 2012-04-10 11:27:38 |
| 47 | 2012-04-10 11:28:39 |
| 48 | 2012-04-10 11:29:38 |
+----+---------------------+
5 rows in set (0.00 sec)
3 如果要把Slave提升為Master,這樣就得修改Slave上的event的Status.
3.1為了方便測試先把Master上的e_replication事件drop.但此操作不被記錄到binlog中,這樣Slave上的event還是存在,但不運行
mysql> set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)
mysql> drop event e_replication;
Query OK, 0 rows affected (0.00 sec)
mysql> set sql_log_bin=1;
Query OK, 0 rows affected (0.00 sec)
3.2 修改slave上的e_replication為enable, 查看到已清空的t_event表中又有了數(shù)據(jù),則數(shù)據(jù)slave上的event被“激活了”。
mysql> select * from t_event;
Empty set (0.00 sec)
mysql> alter event e_replication enable;
Query OK, 0 rows affected (0.00 sec)
//有數(shù)據(jù)了
mysql> select * from t_event;
+----+---------------------+
| id | time |
+----+---------------------+
| 90 | 2012-04-10 12:15:53 |
+----+---------------------+
1 row in set (0.00 sec)
// 可見Status從 Status: SLAVESIDE_DISABLED到 Status: ENABLED
mysql> show events\G
*************************** 1. row ***************************
Db: test
Name: e_replication
Definer: root@localhost
Time zone: SYSTEM
Type: RECURRING
Execute at: NULL
Interval value: 1
Interval field: MINUTE
Starts: 2012-04-10 12:02:53
Ends: NULL
Status: ENABLED
1 row in set (0.00 sec)
mysql> select * from t_event;
+----+---------------------+
| id | time |
+----+---------------------+
| 90 | 2012-04-10 12:15:53 |
+----+---------------------+
1 row in set (0.00 sec)
|
評分
-
查看全部評分
|