データテーブル移行のデータ整合性検証

WBOY
リリース: 2016-06-13 12:18:36
オリジナル
961 人が閲覧しました

データテーブル移行時のデータ整合性検証

データベースを移行する際に、移行前後のデータ項目数が一致しているか、データが一致しているかなど、必要な検証を行うと非常に便利です。検証 エントリの数を言うのは簡単ですが、データが一貫しているかどうかを検証する場合はどうすればよいでしょうか? もちろん、すべてのエントリにエラーが含まれていないことが必要です。省略すると面倒ですし、サーバー上では二つのテーブルが同じではなくなります。このときどうすればよいでしょうか?

  1. テーブルから A、B、C などの重要なフィールドをいくつか選択し、これらのフィールドを比較ルーラーとして使用するという方法があります。
  2. 各データのこれら 3 つのフィールドを元のテーブルからファイル f1 にエクスポートします。
  3. 各データのこれら 3 つのフィールドを宛先テーブルからファイル f2 に転送します。
  4. ファイル f1 と f2 の各データを比較して、それらが同じかどうかを確認します。
  5. 結論

上記の方法は同時に考えられたもので悪くはありませんが、改善の余地があると思います。

  • 1 つ目は、非プライマリ フィールドでもすべてのフィールドが異なって表示されるわけではないということです。
  • 全体的な効率は比較的低いです

私のアイデアは次のとおりです:

  1. テーブル内のデータを n 個ごとに結合します (直接接続、n 個のデータを値は各データのデータサイズに依存します)。
  2. これらの n 個のデータの md5 値を計算し、すべてのデータ値が取得されるまでファイル f1 に追加します。
  3. ファイル f2 に記録されている宛先テーブルについても同様です。
  4. ファイル f1 と f2 の md5 値を比較し、一致していれば成功です。
  5. 矛盾している場合は、各 md5 値を上から下まで比較し、m 番目の不一致値を見つけます。
  6. 矛盾したデータは m*(n-1) 1 ~ m*n の間にあると結論付けられ、位置決めを再度選択できます。

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";	}}
ログイン後にコピー

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート