在遷移資料庫的時候做一些必要的驗證還是很有用的,比如說遷移前後的資料條數是否一致,資料是否一致,這個時候怎麼辦呢,驗證條數還好說,要是驗證資料是否一致呢,對於重要的數據當然要每個都不會差錯,隨機抽樣驗證肯定是不行的,萬一遺漏了就麻煩了,而且兩張表不再同一台伺服器上。這時候該怎麼辦呢,有個方法:
上面這種方法是同時想出來的,也還不錯,但我覺得還有改進的空間:
我的想法是這樣:
第二種方法的好處是輸出檔案會在一定範圍縮小,比對方便,但是也有缺點,不能像第一種方法一樣直接透過關鍵欄位定位不同資料的位置。
以下是第二種方法效果和的具體程式碼實作:
<?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"; } }
以上就介紹了資料表遷移資料一致性驗證,包含了方面的內容,希望對PHP教學有興趣的朋友有幫助。