如何有效的跟蹤線上 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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...