溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發(fā)布時間:2020-08-11 20:08:08 來源:ITPUB博客 閱讀:179 作者:eddy0lion 欄目:關系型數(shù)據(jù)庫

在遷移數(shù)據(jù)庫的時候做一些必要的驗證還是很有用的,比如說遷移前后的數(shù)據(jù)條數(shù)是否一致,數(shù)據(jù)是否一致,這個時候怎么辦呢,驗證條數(shù)還好說,要是驗證數(shù)據(jù)是否一致呢,對于重要的數(shù)據(jù)當然要每條都不會有差錯,隨機抽樣驗證肯定是不行的,萬一遺漏了就麻煩了,而且兩張表不再同一臺服務器上。這個時候該怎么辦呢,有一種方法:

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

  上面這種方法是同時想出來的,也還不錯,但我覺得還有改進的余地:

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

  我的想法是這樣:

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

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

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

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

?
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
 *                          是否計算條數(shù)  是否計算輸出d5并保存到文件  合并數(shù)據(jù)的級別
 *
 */
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問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI