經過開發和測試環境部署 現在到了我們動手的時候了,萬事開頭難,首先我們實現個小功能 今天我們準備實現這樣一個功能:數據永遠也不會被DELETE掉 ...
從事DBA工作多年
MYSQL源碼也是頭一次接觸
嘗試記錄下自己看MYSQL5.7源碼的歷程
目錄:
51ak帶你看MYSQL5.7源碼3:修改代碼實現你的第一個Mysql版本
經過開發和測試環境部署
現在到了我們動手的時候了,萬事開頭難,首先我們實現個小功能
今天我們準備實現這樣一個功能:數據永遠也不會被DELETE掉
當你把這個版本的MYSQL放到線上環境以後,就永遠不用擔心有人來DELETE你的數據了
思路很簡單:順騰摸瓜找到Delete所在的FUNC在函數開頭就返回一個OK
問題來了,怎麼找到這個函數?
有兩種:一種很有靈性的同學,可能一眼就看到了sql/sql_delete.cc 這個文件 ,猜到是這個文件
另一種方法就是基礎一點,我們順著這樣的代碼一層一層找到這裡也行。
dispatch_command |->mysql_parse |->mysql_execute_command ->mysql_update/mysql_delete
為了快速上手,我們用第一種方法,直接打開sql/sql_delete.cc
找到這個方法:
bool Sql_cmd_delete::execute(THD *thd) { DBUG_ASSERT(thd->lex->sql_command == SQLCOM_DELETE); LEX *const lex= thd->lex; SELECT_LEX *const select_lex= lex->select_lex; SELECT_LEX_UNIT *const unit= lex->unit; TABLE_LIST *const first_table= select_lex->get_table_list(); TABLE_LIST *const all_tables= first_table; if (delete_precheck(thd, all_tables)) return true; DBUG_ASSERT(select_lex->offset_limit == 0); unit->set_limit(select_lex); /* Push ignore / strict error handler */ Ignore_error_handler ignore_handler; Strict_error_handler strict_handler; if (thd->lex->is_ignore()) thd->push_internal_handler(&ignore_handler); else if (thd->is_strict_mode()) thd->push_internal_handler(&strict_handler);
/*註:我們要改的就是這裡,直接返回一個true,而把真正要執行的地方給註釋掉了*/ bool res =true; /*MYSQL_DELETE_START(const_cast<char*>(thd->query().str)); bool res = mysql_delete(thd, unit->select_limit_cnt); MYSQL_DELETE_DONE(res, (ulong) thd->get_row_count_func()); */ /* Pop ignore / strict error handler */ if (thd->lex->is_ignore() || thd->is_strict_mode()) thd->pop_internal_handler(); return res; }
好了,代碼就改這一個小地方,現在去編譯運行
然後建 一個測試表往裡寫幾條數據,然後嘗試各種DELETE語句,接下來就是見證奇跡的時候了,你會發現數據永遠不能被DELETE掉了。。
mysql> select * from t1; +----+ | id | +----+ | 1 | | 2 | | 3 | | 4 | | 5 | +----+ 5 rows in set (0.00 sec) mysql> delete from t1 where id=2; Query OK, 0 rows affected (0.00 sec)
mysql> select * from t1;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+----+
5 rows in set (0.00 sec)
怎麼樣,小小的一個改動,就讓你再也不擔心數據被刪除了,感覺很酷有沒有
看到這裡的同學,現在你已經有了第一個自定義版 的MYSQL了,還不趕緊打包發佈到線上去!!
讓那些RD同學感受一下來自DBA的控制力吧。
可能有好事的同學會問,這隻防了DELETE,沒防TRUNCATE和DROP啊。。。
這樣問的同學,我覺得你不夠有靈性。。
好,今天到此為止