データテーブル移行時のデータ整合性検証
データベースを移行する際に、移行前後のデータ項目数が一致しているか、データが一致しているかなど、必要な検証を行うと非常に便利です。検証 エントリの数を言うのは簡単ですが、データが一貫しているかどうかを検証する場合はどうすればよいでしょうか? もちろん、すべてのエントリにエラーが含まれていないことが必要です。省略すると面倒ですし、サーバー上では二つのテーブルが同じではなくなります。このときどうすればよいでしょうか?
上記の方法は同時に考えられたもので悪くはありませんが、改善の余地があると思います。
私のアイデアは次のとおりです:
2 番目の方法の利点は、出力ファイルが特定の範囲内に縮小されるため、比較が容易になることですが、キー フィールドを通じて異なるデータの場所を直接見つけることができないという欠点もあります。最初の方法のように。
以下は、2 番目の方法の効果合計の具体的なコード実装です。
<?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"; }}