mysql checksum table golang

2023-05-16

package main

import (
	"bytes"
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"io/ioutil"
	"regexp"
	"strconv"
	"strings"
	"sync"
)

var wg sync.WaitGroup

type DBinfo struct {
	user     string
	pwd      string
	host     string
	port     uint64
	database string
}

type Checkinfo struct {
	host     string
	port     uint64
	database string
	table    string
	checksum uint64
}

func checksumTable(dbinfo *DBinfo, checkinfo *Checkinfo) {
	db := getConn(dbinfo)
	if db == nil {
		return
	}
	defer db.Close()
	tbuf := bytes.Buffer{}
	tbuf.WriteString("checksum table ")
	tbuf.WriteString(checkinfo.table)
	rows, err := db.Query(tbuf.String())
	if err != nil {
		return
	}
	if rows.Next() {
		var table_name string
		var checksum uint64
		rows.Scan(&table_name, &checksum)
		checkinfo.checksum = checksum
	}
}

func getConn(dbinfo *DBinfo) *sql.DB {
	url := bytes.Buffer{}
	url.WriteString(dbinfo.user)
	url.WriteString(":")
	url.WriteString(dbinfo.pwd)
	url.WriteString("@tcp(")
	url.WriteString(dbinfo.host)
	url.WriteString(":")
	url.WriteString(strconv.FormatUint(dbinfo.port, 10))
	url.WriteString(")/")
	url.WriteString(dbinfo.database)
	url.WriteString("?charset=utf8")
	db, err := sql.Open("mysql", url.String())
	if err != nil {
		return nil
	}
	return db
}

func getTables(dbinfo *DBinfo) *map[string]Checkinfo {
	dict := make(map[string]Checkinfo)
	db := getConn(dbinfo)
	if db == nil {
		return nil
	}
	defer db.Close()
	rows, err := db.Query("show tables")
	if err != nil {
		return nil
	}
	for rows.Next() {
		var table_name string
		rows.Scan(&table_name)
		dict[dbinfo.database+"_"+table_name] = Checkinfo{host: dbinfo.host, port: dbinfo.port, database: dbinfo.database, table: table_name}
	}
	return &dict
}

func getDatasource(path string) *map[string]DBinfo {
	dict := make(map[string]DBinfo)
	reg_coll, _ := regexp.Compile(`[/:]+`)
	rf, _ := ioutil.ReadFile(path)
	ar := strings.Split(string(rf), "\n")
	for _, item := range ar {
		ar_coll := reg_coll.Split(item, -1)
		if len(ar_coll) == 5 {
			port, _ := strconv.ParseUint(ar_coll[1], 10, 64)
			dict[ar_coll[2]] = DBinfo{host: ar_coll[0], port: port, database: ar_coll[2], user: ar_coll[3], pwd: ar_coll[4]}
		}
	}
	return &dict
}

func workhandle(skey string, sdbinfo DBinfo, target *map[string]DBinfo) {
	dict := getTables(&sdbinfo)
	if dict != nil {
		for dkey, dcheckinfo := range *dict {
			checksumTable(&sdbinfo, &dcheckinfo)
			//fmt.Println(dkey, "source", dcheckinfo)
			tdbinfo := (*target)[skey]
			tcheckinfo := &Checkinfo{host: tdbinfo.host, port: tdbinfo.port, database: tdbinfo.database, table: dcheckinfo.table}
			checksumTable(&tdbinfo, tcheckinfo)
			//fmt.Println(dkey, "target", tcheckinfo)
			if dcheckinfo.checksum != tcheckinfo.checksum {
				fmt.Println(dkey, "source", dcheckinfo, "->", dkey, "target", tcheckinfo)
			}
		}
	}
	wg.Done()
}
func run() {
	source := getDatasource("/home/work/etc/a.lst")
	target := getDatasource("/home/work/etc/b.lst")
	for skey, sdbinfo := range *source {
		wg.Add(1)
		go workhandle(skey, sdbinfo, target)
	}
	wg.Wait()
}

func main() {
	run()
}



cat /home/work/etc/a.lst 
127.0.0.1:3306/test/xm_dba/123456
127.0.0.1:3306/test_1/xm_dba/123456

cat /home/work/etc/b.lst 
127.0.0.1:3306/test/xm_dba/123456
127.0.0.1:3306/test_1/xm_dba/123456


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql checksum table golang 的相关文章

随机推荐

  • UISearchBar的占位符 (Placeholder,包括图片文字) 如何居左显示 ?

    转载至 xff1a https blog csdn net qq 33226881 article details 76512656 UISearchBar的占位符 Placeholder 如何居左显示 xff1f 做项目的时候遇到这个问题
  • C语言冒泡排序

    1 基本原理 冒泡排序指的是在排序时 xff0c 每次比较数组中相邻的两个数组元素的值 xff0c 较小的数 xff08 从小到大排列 xff09 排在较大的数前面 排序的基本思想 两两相邻的元素进行比较 xff0c 并且可能的话需要进行交
  • dell optiplex ubuntu 14.04 安装 NVIDIA 显卡驱动

    公司配置的 dell optiplex使用核显带起双屏幕 xff0c 玩dota2无法特效全开 so xff0c 在京东上买了一块750Ti 安装驱动的时候需要切换到ubuntu的全命令行模式 xff0c 关掉桌面系统才能安装 这时候这个坑
  • golang tcp 2 unix socket proxy

    想将mysql 的TCP 封死 xff0c 所有外部链接由我的proxy来控制 xff0c so 写了一个 tcp 转 unix socket 的 proxy package main import 34 os 34 34 fmt 34 3
  • backup mysql for xtrabackup with xbstream and lz4

    需要临时为mysql添加一个实例 xff0c 使用xtrabackup最简单快速 在现有数据节点上 xff1a home work app xtrabackup 2 2 3 innobackupex ibbackup 61 home wor
  • MySQL分组排序取前N条记录以及生成自动数字序列--group by 后 limit 外加 rownumber

    同事提了一个需求 xff0c 要求按照某列分组 xff0c 然后将各组的前几条抽取出来 表结构 CREATE TABLE 96 total freq ctrl 96 96 time 96 int 10 unsigned NOT NULL 9
  • docker init 起步

    yum install wget http fedora mirror nexicom net epel 6 x86 64 epel release 6 8 noarch rpm yum y install epel release 6 8
  • 设置xrdp使用固定的会话

    修改xrdp ini配置文件 xff0c 位于 etc xrdp xrdp ini 要打开和编辑xrdp的配置文件 xff0c 请使用 xff1a sudo nano etc xrdp xrdp ini 默认情况下 xff0c 第一个xrd
  • 回想当年 91d2 1588 神戒

    渡鳥之箍 全JP属性 xff0c 1588成交
  • mysql 事务 rollback 失效

    最近支付业务发生了一件怪事 xff0c 在一个事务 失败后 xff0c 调用rollback xff0c 发现只rollback 了最后一条sql 开发查了很久 xff0c 发现是网络抖动 xff0c 造成第一次创建链接的 begin 丢掉
  • 旅游

    每次出游 我们自己看来 别人看来 实际上
  • 使用cgroup 限制进程的磁盘io

    cat etc cgconfig conf Copyright IBM Corporation 2007 Authors Balbir Singh lt balbir 64 linux vnet ibm com gt This progra
  • mac ox ssd 开启 trim

    使用clover 补丁开启
  • aerospike参考资料

    本文转自 xff1a http blog csdn net songhuiqiao article details 50324073 aerospike QQ群 xff1a 419183757 http blog csdn net jias
  • aerospike init

    本文转自 xff1a http blog csdn net songhuiqiao article details 50324109 aerospike QQ群 xff1a 419183757 aerospike init 1 aerosp
  • 文章标题

    本文转自 xff1a http blog csdn net songhuiqiao article details 50324139 aerospike QQ群 xff1a 419183757 Distribution 分布 Aerospi
  • 源码编译aerospike-server-3.6.4

    生产环境一直使用3 5 3这个版本 xff0c 和开发商量了一下 xff0c 在测试环境使用3 6 4搭建集群 xff0c 如果运行稳定就找机会将生产环境的集群升级 aerospike QQ群 xff1a 419183757 从github
  • 暗黑破坏神 2 私服 sf 114.215.178.67

    注册表 REGEDIT4 HKEY CURRENT USER Software Blizzard Entertainment Diablo II 34 BNETIP 34 61 34 114 215 178 67 34 1 11b 原版 Q
  • Linux下NVIDIA驱动手动安装

    1 查看当前电脑的显卡型号 lshw numeric C display 执行完毕后我的显卡型号为 GTX 960M xff1a 2 下载NVIDIA官方驱动 到NVIDIA的官方驱动网站下载对应显卡的驱动程序 xff0c 下载后的文件格式
  • mysql checksum table golang

    package main import 34 bytes 34 34 database sql 34 34 fmt 34 34 github com go sql driver mysql 34 34 io ioutil 34 34 reg