温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

数据表迁移数据一致性验证

发布时间:2020-08-11 20:08:08 来源:ITPUB博客 阅读:179 作者:eddy0lion 栏目:关系型数据库

在迁移数据库的时候做一些必要的验证还是很有用的,比如说迁移前后的数据条数是否一致,数据是否一致,这个时候怎么办呢,验证条数还好说,要是验证数据是否一致呢,对于重要的数据当然要每条都不会有差错,随机抽样验证肯定是不行的,万一遗漏了就麻烦了,而且两张表不再同一台服务器上。这个时候该怎么办呢,有一种方法:

  1. 从表中选取几个重要字段,比如说A、B、C,用这几个字段作为比对的标尺。
  2. 从原表中导出每条数据的这三个字段到一个文件f1中。
  3. 从目的表中到处每条数据的这三个字段到文件f2中。
  4. 比对文件f1、f2文件中的每条数据是否相同。
  5. 得出结论

  上面这种方法是同时想出来的,也还不错,但我觉得还有改进的余地:

  • 首先就是不是所有字段,仍然有可能在非主要字段出现different。
  • 整体效率比较低

  我的想法是这样:

  1. 对表中的每n条数据进行拼接(直接连接起来,n取值取决于每条数据的数据量大小)。
  2. 计算这n条数据的md5值,添加到文件f1中,直到所有数据取值完成。
  3. 对目的表也一样,记录的文件f2中。
  4. 比对文件f1、f2文件的md5值,如果一致,ok,成功。
  5. 如果不一致,从上倒下比对每条md5值,找到第m条不一致。
  6. 得出结论,不一致的数据在m*(n-1)+1 ~ m*n之间,可以再次选择定位。

  第二种方法的好处就是输出文件会在一定范围缩小,比对方便,但是也有缺点,不能像第一种方法一样直接通过关键字段定位不同数据的位置。

  下面是第二种方法效果和的具体代码实现:

数据表迁移数据一致性验证

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<!--?php
/**
 * 使用方法:
 * php -f mysql_diff.php    yes             dir                         10
 *                          是否计算条数  是否计算输出d5并保存到文件  合并数据的级别
 *
 */
if(php_sapi_name() != 'cli')
{
    die("请在CLI模式下运行");
}
 
array_shift($argv);
if(empty($argv))
{
    die("at letase contain one info");
}
 
$is_count = array_shift($argv);
$is_md5 = empty($argv) ? false : array_shift($argv);
$conbine_num = empty($argv) ? 1 : intval(array_shift($argv));
if($is_md5 && !is_dir($is_md5) && !mkdir($is_md5, 777, true))
{
    die("error info : md5 info must be input to a file");
}
$dbinfos = array(
    'host' => 'localhost',
    'port' => '3306',
    'user' => 'root',
    'pswd' => '123456',
    'charset' => 'utf8',
    'tables' => array(
        'lagou.pos',
        'lagou.pos_innodb',
    ),
);
 
//验证格式
if(!$link = mysql_connect($dbinfos['host'].":".$dbinfos['port'],$dbinfos['user'], $dbinfos['pswd']))
{
    die("connect to [{$host}@{$port}] failed!!");
}
 
if(!mysql_query("set names {$dbinfos['charset']}"))
{
    die("set charset error : ".mysql_error());
}
 
foreach ($dbinfos['tables'] as $table)
{
    if($is_count)
    {
        $sql = "select count(*) as nums from {$table}";
 
        $ret = mysql_query($sql);
        if(!$ret)
        {
            die("error : ".mysql_error());
        }
        $ret = mysql_fetch_array($ret, MYSQL_ASSOC);
        echo "{$table} : {$ret['nums']}\n";
    }
     
     
    if($is_md5)
    {
        $path = $is_md5.DIRECTORY_SEPARATOR.$table;
        $sql = "select * from {$table}";
        $ret = mysql_query($sql);
        $flag = 0;
        $fields = '';
        while ($_ret = mysql_fetch_array($ret, MYSQL_NUM)) {
            $flag++;
            while($_ret)
            {
                $fields .= array_pop($_ret);
            }
            if($flag % $conbine_num == 0)
            {
                file_put_contents($path, md5($fields)."\n", FILE_APPEND);
                $fields = '';
            }
        }
        if($flag % $conbine_num != 0 && $flag > 0)
        {
            file_put_contents($path, md5($fields)."\n", FILE_APPEND);
        }
        echo "save to file info : ".realpath($path)."\n";
    }
}

原文地址:https://www.cnblogs.com/iforever/p/4455715.html

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI