关于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

原文地址:https://www.cnblogs.com/Cong0ks/p/10364502.html

时间: 2024-11-05 23:25:09

关于Mysql 查询所有表的实时记录用于对比2个MySQL 库的数据是否异步的相关文章

简单按日期查询mysql某张表中的记录数

测试表表结构:mysql> show create table dr_stats\G 1. row Table: dr_stats Create Table: CREATE TABLE `dr_stats` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `views` int(10) NOT NULL DEFAULT '0' COMMENT '展示量', `num` mediumint(8) NOT NULL DEFAULT '0' CO

mysql 查询锁表

1)使用情景"判断通过后写入数据库",这个一般是不会有问题的, 但并发访问的时候就不太好搞.因为写入(insert)是需要时间的,假设现在有两个并发请求,(假设第一个访问是最后一个符合条件的写入请求,按照逻辑,第二个请求应该是不合法.不能写入的),在第一请求成功写入之前,第二请求查询到未更新的数据记录,因为记录是未更新的,所以它也是可以通过判断的.最后导致两个请求都写入数据了. 2)解决办法:查询锁表 在我处理完入库前,查都不让你查了,这样就不会判断错误了吧 3)锁表语句 LOCK T

SQL查询一个表的总记录数的方法

一.简单查询语句 1. 查看表结构 SQL>DESC emp; 2. 查询所有列 SQL>SELECT * FROM emp; 3. 查询指定列 SQL>SELECT empmo, ename, mgr FROM emp; SQL>SELECT DISTINCT mgr FROM emp; 只显示结果不同的项 4. 查询指定行 SQL>SELECT * FROM emp WHERE job='CLERK'; 5. 使用算术表达式 SQL>SELECT ename, sa

MySQL(四) —— 操作数据表中的记录

插入记录 INSERT [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} ({expr | DEFAULT},...),(...),... //法二:区别在于,此方法可以使用子查询(SubQuery) INSERT [INTO] tbl_name SET col_name={expr|DEFAULT},... //法三:此方法可以将查询结果插入到指定数据表 INSERT [INTO] tbl_name [(col_name,...)] SELEC

mysql 查询所有表名

mysql使用sql查询表名的两种方法: 1.show tables; 2.SELECT TABLE_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='dbname';–dbname为mysql的数据库名称 查询指定数据库中指定表的所有字段名 select column_name from information_schema.columns where table_schema='YOURDATABASENAM

mysql查询出所有重复的记录

假如我们有如下一张数据表(很简单,只是举例而已),表名为student.现在我们要取出其中重复记录.重复是以name相同为判定标准. ID name phone age 1 张三 10086 15 2 李四 10010 20 3 王五 10010 22 4 赵六 10010 22 5 孙七 10010 22 查找出所有的重复数据 SELECT * FROM student WHERE phone IN (SELECT shortname FROM student GROUP BY phone H

MYSQL查询A表中不存在于B表中的所有符合条件的数据

在开发过程中,总有一些需求是需要查看在A表中ID不存在于B表中的ID的情况: 下面有三种方法可以实现这一需求: 第一种:使用Not in 方法通过子查询的结果集来做过滤: select * from A where 1=1 AND A.ID not in (select ID from B ) 这种情况最常见也是最容易理解的逻辑SQL代码,但是会有很多问题出现. 首先,这种情况是针对数据量比较小的情况使用的,原因在于IN 和 NOT IN并不是针对索引进行查询的,操作效率相对较慢.可以通过使用N

mysql查询-从表1中查询出来的结果重新插入到表1

原有表结构 CREATE TABLE `t_card_user` ( `id` varchar(32) NOT NULL, `card_user_id` bigint(20) DEFAULT NULL COMMENT 'UserID受设备最大用户数影响,范围为1--最大用户数.', `card_no` bigint(20) DEFAULT NULL COMMENT 'CardNo最大为4294967295(2^32次方)', `start_time` datetime DEFAULT NULL

MySQL 查询最近几天的记录 最近7天的记录 本周内的记录

本周内:select * from wap_content where week(created_at) = week(now) 查询一天:select * from table where to_days(column_time) = to_days(now());select * from table where date(column_time) = curdate(); 查询7天:select * from table  where DATE_SUB(CURDATE(), INTERVA