首頁  >  文章  >  後端開發  >  資料表遷移資料一致性驗證

資料表遷移資料一致性驗證

WBOY
WBOY原創
2016-08-08 09:25:251148瀏覽

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

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

  

以上就介紹了資料表遷移資料一致性驗證,包含了方面的內容,希望對PHP教學有興趣的朋友有幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn