• 数据表迁移数据一致性验证


      在迁移数据库的时候做一些必要的验证还是很有用的,比如说迁移前后的数据条数是否一致,数据是否一致,这个时候怎么办呢,验证条数还好说,要是验证数据是否一致呢,对于重要的数据当然要每条都不会有差错,随机抽样验证肯定是不行的,万一遗漏了就麻烦了,而且两张表不再同一台服务器上。这个时候该怎么办呢,有一种方法:

    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']}
    ";
    	}
    	
    	
    	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)."
    ", FILE_APPEND);
    				$fields = '';
    			}
    		}
    		if($flag % $conbine_num != 0 && $flag > 0)
    		{
    			file_put_contents($path, md5($fields)."
    ", FILE_APPEND);
    		}
    		echo "save to file info : ".realpath($path)."
    ";
    	}
    }
    

      

  • 相关阅读:
    【软件工程】软件测试目标定义 黑盒测试、白盒测试
    【计算机网络】互联网的组成(客户服务器、对等连接、电路交换、分组交换)
    【计算机网络】互联网概述
    文本域的宽度和高度应该用cols和rows来控制,还是 用width和height来控制
    javascript代码片段
    IE对象最后一个属性后不要加逗号,否则在IE7及以下版本中会报错
    检测IE浏览器方法
    Sublime Text 必备插件
    浅谈Javascript 中几种克隆(clone)方式
    JavaScript instanceof 运算符深入剖析
  • 原文地址:https://www.cnblogs.com/iforever/p/4455715.html
Copyright © 2020-2023  润新知