關於Mysql 查詢所有表的實時記錄用於對比2個MySQL 庫的數據是否異步
Xu言:
今天,為了研究一個MySQL主從同步開機後報錯 問題,如下圖
故障原因分析:
經過分析,可能是主從服務器開機順序導致。(有待下次斷電再次測試)
主從錯誤提示:日誌讀取錯誤的問題。解決方法:更新日誌記錄文件,重新主從同步。
擔心主從問題過程中有數據寫入,想去確認下主從庫上的數據是否一致。想到了查詢下數據庫行數的方式。
網上查詢了下 ,一般有2種:
方法一:查看當前表的記錄行數
SELECT count(*) from 表名
方法二:"查看數據庫中所有表的記錄數" # 這裏之所以打引號,是因為這裏的數據不準確
SELECT table_name,table_rows FROM information_schema.tables
WHERE TABLE_SCHEMA = ‘testdb‘
ORDER BY table_rows DESC;
所以,經過各路大仙幫助使用了第一種方法進行了改良。
拼接法:
借助information_schema庫的tables表,來拼接出一個條sql語句
use information_schema; select concat( ‘select "‘, TABLE_name, ‘", count(*) from ‘, TABLE_SCHEMA, ‘.‘, TABLE_name, ‘ union all‘ )from tables where TABLE_SCHEMA=‘數據庫名‘;
拼接出來以後,使用工具去掉“union all ”部分,批量執行。
Python方式循環:
#!/usr/bin/env python # Author: Loki # Date: 2019-02-012 # Version: 0.1 import pymysql User = ‘‘ # 這裏補充你的MySQL用戶名 Pass = ‘‘ # 這裏補充你的MySQL密碼 Port = 33060 # 自己的MySQL端口 db = pymysql.connect(host="192.168.x.x", port=Port, user=User, password=Pass, db=‘數據庫名‘) cursor = db.cursor() cursor.execute("show tables") # 查詢本數據庫的所有表名 table_name = cursor.fetchall() count = 0 for item in table_name: # 循環 count += 1 tbn = item[0] sql_ = "SELECT count(*) FROM %s" % tbn cursor.execute(sql_) data = cursor.fetchone() print("table_name=%s, row=%s" % (tbn,data)) print("table totle= %s" % count) # Close Connect cursor.close() db.close()
以上Python方法輸出比較不友好,可以優化為輸出到文本裏面。賬號密碼部分也可以使用input()函數方式來提示填入
Shell方式循環:
#!/bin/bash
# Author:Jerry
tb_name=`mysql -u賬號 -p密碼 -h192.168.x.x -P端口 -e "select table_name from information_schema.tables where table_schema=‘數據庫名‘"|awk ‘NR>1{print $1}‘` for name in $tb_name ; do tbl_count=`mysql -u賬號 -p密碼 -h192.168.x.x -P端口 -e "select count (*) as times from cwsys.$name;"| tail -1` echo "$name=$tbl_count" >>/home/xxx/xxx.log done
以上就是使用的一些方法和思路,留個記錄以作備忘。
PS:最後鳴謝各路大仙,就不一一點名!你們懂得
參考資料:
https://www.cnblogs.com/woider/p/5926744.html
https://blog.csdn.net/a19860903/article/details/52311765
https://www.cnblogs.com/xfxing/p/9322199.html
關於Mysql 查詢所有表的實時記錄用於對比2個MySQL 庫的數據是否異步