如何有效的跟蹤線上 MySQL 實例表和許可權的變更

来源:http://www.cnblogs.com/arstercz/archive/2017/05/17/6867894.html
-Advertisement-
Play Games

介紹 從系統管理員或 DBA 的角度來講, 總期望將線上的各種變更限制在一個可控的範圍內, 減少一些不確定的因素. 這樣做有幾點好處: 從這三點來看, 有很多種方式可以實現, 比如通過 migrate 等工具強制所有的操作都以統一的方式執行, 這需要開發人員做更多的配合, 所以這類工具在非規模話的業 ...


介紹

從系統管理員或 DBA 的角度來講, 總期望將線上的各種變更限制在一個可控的範圍內, 減少一些不確定的因素. 這樣做有幾點好處:

1. 記錄線上的庫表變更;
2. 對線上的庫表變更有全局的瞭解;
3. 如果有問題, 方便回滾操作;

從這三點來看, 有很多種方式可以實現, 比如通過 migrate 等工具強制所有的操作都以統一的方式執行, 這需要開發人員做更多的配合, 所以這類工具在非規模話的業務場景中較難實現; 另外管理員或 DBA 也可以通過知識庫比如 redmine 等類似的方式記錄變更, 不過不可控因素很多, 特別依賴上線的流程, 也容易出現紕漏. 這就引申出本文要介紹的如何跟蹤線上庫表的變更, 下文以 MySQL 資料庫介紹說明.

跟蹤的方式

在 Postgresql 中, 由於觸發器對各種操作都有很好的支持, 我們完全可以通過觸發器的形式來記錄所有 DDL 語句的變更. 與此相比, MySQL 則顯得較為弱小, 我們只能以其它方式實現類似的目標. 下麵以中間件, log, binlog, 註冊 slave, mysqldiff 五種方式進行介紹.

1. 中間件

現有的中間件 atlaskingshardmycat 等, 都以 proxy 的角色部署於程式和 MySQL 之間, 所有發往 MySQL 的 sql 都通過 proxy 進行轉發. 如下圖所示, 我們可以在 proxy 層面增加一些 DDL, DML 相關語句的記錄, 達到跟蹤變更的目的.

    +------+        +-------+        +-------+
    | app  |  --->  | proxy |  --->  | MySQL |
    +------+        +-------+        +-------+

這種方式自由度較高, 大家都可以隨意定製. 不過需要一些開發能力, 另外 sql 的過濾也會影響到查詢的性能, 通過中間件來直接修改表結構等操作也是有風險較大的方式.

2. log

這種方式很簡單, 打開 MySQL 的 general log 或 audit log 即可記錄所有的 sql 語句. 這種方式比較適合開發環境, 線上環境如果開啟會產生很多日誌, 弊遠遠大於利, 也不利於維護;

3. binlog

管理員或 DBA 同樣可以解析 MySQL 的 binlog 來過濾表或許可權的變更. 這種方式本質上等同第二種方式, 線上資料庫需要開啟 binlog 選項, 解析 binlog 也是很耗資源的操作. 線上如果實例較多, 這種方式特別不可取.

4. 註冊 slave

註冊 slave 的意思即通過 MySQL 的主從協議偽造一個假的 slave, 這樣 master 會把所有的更新都發送過來, 再進行一些過濾的操作. 這種方式在同步數據或增量消費的場景特別適合, 這裡只用於記錄表或許可權的變更確實是大材小用, 線上實例較多的話也不可取. 典型的工具有 myreplicationtungsten-replicator 以及阿裡的 canal 等.

5. mysqldiff

實際上許可權和表變更本身是低頻率的操作事件, 上述的四種方式雖然都可以達到目標, 但本質上都是很耗費資源的操作. 考慮到這點, 我們可以通過對比的方式來實現許可權及表結構變更的跟蹤, 詳見 sys-mysql-diff 工具. 考慮到通用性, sys-mysql-diff 工具每次都需要獲取指定庫的所有表的定義語句, 通過對比來生成對應的 DDL 語句. mysqldiff 則是對 sys-mysql-diff 工具的封裝, 可以批量跟蹤多個實例.

如何使用 mysqldiff

mysqldiff 工具是在 sys-mysql-diff 工具的基礎上進行了一層封裝, 所以本質上是通過 sys-mysql-diff 工具跟蹤線上庫的變化. 在實際的運用中, 需要註意以下幾點:

1. 配置文件

mysqldiff 所需要的配置參考以下:

[backend]
dsn = user_mysqlmon:xxxxxxxx@tcp(10.0.21.17:3306)/mysqldiff?charset=utf8

[test3301]
host = 10.0.21.5
port = 3301
db   = test
user = user_mysqldiff
pass = xxxxxxxx
tag  = host_location

[test3306]
host = 10.0.21.7
port = 3306
db   = percona
user = user_mysqldiff
pass = xxxxxxxx
tag  = host_location

2. 許可權

所有的變更結果都會保存到指定的 MySQL 庫中的 mysql_diff 表, 即上述的 [backend] 部分, 對於該表需要 select, insert, update 相關的許可權. 被跟蹤的實例則是 [testXXXX] 部分, 由於需要查看表結構和用戶許可權所以需要 select 和 grant option 許可權. 我們以 user_mysqlmon 用戶為 [backend] 的用戶, 以 user_mysqldiff 為 [testXXXX] 部分的用戶為例, 需要賦予他們以下許可權:

grant select,insert,update on mysqldiff.* to user_mysqlmon@`10.0.21.%`;
grant select on *.* to user_mysqldiff@`10.0.21.%` with grant option;

配置中的 db = information_schema 則表示跟蹤所有的資料庫;

3. 運行

運行 mysqldiff 命令進行跟蹤:

# ./mysqldiff -conf conf.cnf -verbose
2017/03/20 16:31:27 ---------------------------
changes from 10.0.21.5:3301 
changes from 10.0.21.7:3306 
DROP TABLE `emp`;
SET GLOBAL wait_timeout = 1000;
2017/03/20 16:31:27 insert 10.0.21.17:3306/percona ok
2017/03/20 16:31:27 ---------------------------

insert ... ok 一行表示將結果插入到了 [backend] 中.

總結

以 mysqldiff 方式跟蹤庫表及許可權的變化相對簡單方便, 比起其它方式算得上輕便. 另外也不受業務場景和管理員習慣的制約, 相對很通用. 不過其也有自身的缺陷, 在短時間內經常變更的表則很難跟蹤, mysqldiff 僅能記錄最後一次的變更. 另外管理員需要嚴格限制配置文件的許可權, 最好給予 0600 的許可權僅限當前用戶查看. 不過整體而言, 要跟蹤線上庫表許可權的變更, mysqldiff 是一個較為合適且通用的工具.


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • MySQL5.7開始支持多源複製,也就是多主一從的複製架構: 使用多源複製的考慮: 1、災備作用:將各個庫彙總在一起,就算是其他庫都掛了(整個機房都無法連接了),還有最後一個救命稻草; 2、備份:直接在這個從庫中做備份,不影響線上的資料庫; 3、減少成本:不需要每個庫都做一個實例,也減少了DBA的維 ...
  • 七.數據完整性 1.概念:數據一致性和準確性。 分類:域完整性、實體完整性、引用完整性。 解析:域完整性也叫列完整性是指一個數據集對某個列是否有效和確定是否允許為空值。實體完整性也叫行完整性 要求所有的行都有一個唯一的標示符。引用完整性保證主鍵和外鍵之間的關係總是得到維護。 實現:A聲明數據完整性和 ...
  • 列類型: 1. 數值型 整數類型: tip: 在定義時,可使用unsigned標識沒有符號,若不寫就認為是有符號。 下圖為在表tb_int中,插入在正確範圍內的數值的事例: 當試圖插入超範圍的數值時,會出現下圖中的錯誤提示: 除了可以定義以上數值類型,還可以定義顯示寬度(通過規定顯示寬度,達到統一顯 ...
  • 今天發現mysql中有set這種數據類型,工作的業務中也使用到了。網上查閱資料後,小結一下 先總結一下兩者的分別 set和enum類似表單中的多選和單選,set和enum在資料庫內部是用整數表示的,顯示給我們看的可以是字元串(避免使用數字字元串) api中對兩種類型的解釋如下 兩種類型的數據個數有限 ...
  • 這個月碰到幾個人問我關於“SQL SERVER中INNER JOIN 與 IN兩種寫法的性能孰優孰劣?”這個問題。其實這個概括起來就是SQL Server中INNER JOIN與子查詢孰優孰劣(IN是子查詢的實現方式之一,本篇還是只對比INNER JOIN與子查詢IN的性能,如果展開INNER JO... ...
  • 前言 朋友介紹了一個工具,mycli,支持MySQL查詢語句自動補全等,這裡給大家介紹一下。 大家也可以直接去 "官網" 看一下,安裝使用都很簡單。 安裝 三種方式,簡單到不行 登錄資料庫 也是三種方式,很簡單 截圖 ...
  • MySQL資料庫操作常用命令DOS連接資料庫1.安裝MySQL配置好環境2.運行cmd命令net start mysql3.找到mysql文件根目錄輸入命令mysql -h localhost -u root -p 回車輸入密碼連接資料庫成功MySQL常用命令show databases, 顯示全部 ...
  • 背景介紹 在一般的業務場景中, 初始的時候簡單的自增數(比如MySQL 自增鍵)就可以很好的滿足需求, 不過隨著業務的發展和驅動, 尤其是在分散式的場景中, 如何生成全局的唯一 id 便成了需要慎重考慮的事情. 業務之間如何協調, 生成的序列是否還有其它需求等都需要重新設計, 下文則介紹生成唯一 i ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...