數(shù)據(jù)表遷移數(shù)據(jù)一致性驗(yàn)證

在遷移數(shù)據(jù)庫(kù)的時(shí)候做一些必要的驗(yàn)證還是很有用的,比如說(shuō)遷移前后的數(shù)據(jù)條數(shù)是否一致,數(shù)據(jù)是否一致,這個(gè)時(shí)候怎么辦呢,驗(yàn)證條數(shù)還好說(shuō),要是驗(yàn)證數(shù)據(jù)是否一致呢,對(duì)于重要的數(shù)據(jù)當(dāng)然要每條都不會(huì)有差錯(cuò),隨機(jī)抽樣驗(yàn)證肯定是不行的,萬(wàn)一遺漏了就麻煩了,而且兩張表不再同一臺(tái)服務(wù)器上。這個(gè)時(shí)候該怎么辦呢,有一種方法:

為色尼等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及色尼網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、色尼網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

  1. 從表中選取幾個(gè)重要字段,比如說(shuō)A、B、C,用這幾個(gè)字段作為比對(duì)的標(biāo)尺。
  2. 從原表中導(dǎo)出每條數(shù)據(jù)的這三個(gè)字段到一個(gè)文件f1中。
  3. 從目的表中到處每條數(shù)據(jù)的這三個(gè)字段到文件f2中。
  4. 比對(duì)文件f1、f2文件中的每條數(shù)據(jù)是否相同。
  5. 得出結(jié)論

上面這種方法是同時(shí)想出來(lái)的,也還不錯(cuò),但我覺(jué)得還有改進(jìn)的余地:

  • 首先就是不是所有字段,仍然有可能在非主要字段出現(xiàn)different。
  • 整體效率比較低

我的想法是這樣:

  1. 對(duì)表中的每n條數(shù)據(jù)進(jìn)行拼接(直接連接起來(lái),n取值取決于每條數(shù)據(jù)的數(shù)據(jù)量大小)。
  2. 計(jì)算這n條數(shù)據(jù)的md5值,添加到文件f1中,直到所有數(shù)據(jù)取值完成。
  3. 對(duì)目的表也一樣,記錄的文件f2中。
  4. 比對(duì)文件f1、f2文件的md5值,如果一致,ok,成功。
  5. 如果不一致,從上倒下比對(duì)每條md5值,找到第m條不一致。
  6. 得出結(jié)論,不一致的數(shù)據(jù)在m*(n-1)+1 ~ m*n之間,可以再次選擇定位。

第二種方法的好處就是輸出文件會(huì)在一定范圍縮小,比對(duì)方便,但是也有缺點(diǎn),不能像第一種方法一樣直接通過(guò)關(guān)鍵字段定位不同數(shù)據(jù)的位置。

下面是第二種方法效果和的具體代碼實(shí)現(xiàn):

數(shù)據(jù)表遷移數(shù)據(jù)一致性驗(yà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
 *                          是否計(jì)算條數(shù)  是否計(jì)算輸出d5并保存到文件  合并數(shù)據(jù)的級(jí)別
 *
 */
if(php_sapi_name() != 'cli')
{
    die("請(qǐng)?jiān)贑LI模式下運(yùn)行");
}
 
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',
    ),
);
 
//驗(yàn)證格式
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

本文標(biāo)題:數(shù)據(jù)表遷移數(shù)據(jù)一致性驗(yàn)證
當(dāng)前路徑:http://muchs.cn/article6/jpejog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、標(biāo)簽優(yōu)化微信公眾號(hào)、搜索引擎優(yōu)化、網(wǎng)站收錄、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開(kāi)發(fā)