国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

數據表遷移數據一致性驗證

2019-11-15 02:11:25
字體:
來源:轉載
供稿:網友
數據表遷移數據一致性驗證

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

  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之間,可以再次選擇定位。

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

  下面是第二種方法效果和的具體代碼實現:

<?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";}}

  


上一篇:discuz模板語法

下一篇:JSON

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 松潘县| 九龙县| 登封市| 文安县| 霸州市| 佛冈县| 宜川县| 郯城县| 巫山县| 阜宁县| 雷州市| 临高县| 砚山县| 德江县| 陆河县| 新巴尔虎右旗| 天峨县| 长泰县| 沧源| 抚州市| 沁水县| 梁山县| 如皋市| 鹤壁市| 仁寿县| 贵港市| 遂溪县| 芜湖县| 遂昌县| 肇东市| 阿尔山市| 廉江市| 盘山县| 海安县| 凤台县| 黎川县| 双城市| 海安县| 元朗区| 徐水县| 徐水县|