当前位置:Gxlcms > PHP教程 > 数据表迁移数据一致性验证

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

时间:2021-07-01 10:21:17 帮助过:4人阅读

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

  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之间,可以再次选择定位。

  第二种方法的好处就是输出文件会在一定范围缩小,比对方便,但是也有缺点,不能像第一种方法一样直接通过关键字段定位不同数据的位置。

  下面是第二种方法效果和的具体代码实现:

  1. <!--?php
  2. /**
  3. * 使用方法:
  4. * php -f mysql_diff.php
  5. yes
  6. dir
  7. 10
  8. *
  9. 是否计算条数
  10. 是否计算</pre-->输出d5并保存到文件
  11. 合并数据的级别
  12. *
  13. */
  14. if(php_sapi_name() != 'cli')
  15. {
  16. die("请在CLI模式下运行");
  17. }
  18. array_shift($argv);
  19. if(empty($argv))
  20. {
  21. die("at letase contain one info");
  22. }
  23. $is_count = array_shift($argv);
  24. $is_md5 = empty($argv) ? false : array_shift($argv);
  25. $conbine_num = empty($argv) ? 1 : intval(array_shift($argv));
  26. if($is_md5 && !is_dir($is_md5) && !mkdir($is_md5, 777, true))
  27. {
  28. die("error info : md5 info must be input to a file");
  29. }
  30. $dbinfos = array(
  31. 'host' => 'localhost',
  32. 'port' => '3306',
  33. 'user' => 'root',
  34. 'pswd' => '123456',
  35. 'charset' => 'utf8',
  36. 'tables' => array(
  37. 'lagou.pos',
  38. 'lagou.pos_innodb',
  39. ),
  40. );
  41. //验证格式
  42. if(!$link = mysql_connect($dbinfos['host'].":".$dbinfos['port'],$dbinfos['user'], $dbinfos['pswd']))
  43. {
  44. die("connect to [{$host}@{$port}] failed!!");
  45. }
  46. if(!mysql_query("set names {$dbinfos['charset']}"))
  47. {
  48. die("set charset error : ".mysql_error());
  49. }
  50. foreach ($dbinfos['tables'] as $table)
  51. {
  52. if($is_count)
  53. {
  54. $sql = "select count(*) as nums from {$table}";
  55. $ret = mysql_query($sql);
  56. if(!$ret)
  57. {
  58. die("error : ".mysql_error());
  59. }
  60. $ret = mysql_fetch_array($ret, MYSQL_ASSOC);
  61. echo "{$table} : {$ret['nums']}\n";
  62. }
  63. if($is_md5)
  64. {
  65. $path = $is_md5.DIRECTORY_SEPARATOR.$table;
  66. $sql = "select * from {$table}";
  67. $ret = mysql_query($sql);
  68. $flag = 0;
  69. $fields = '';
  70. while ($_ret = mysql_fetch_array($ret, MYSQL_NUM)) {
  71. $flag++;
  72. while($_ret)
  73. {
  74. $fields .= array_pop($_ret);
  75. }
  76. if($flag % $conbine_num == 0)
  77. {
  78. file_put_contents($path, md5($fields)."\n", FILE_APPEND);
  79. $fields = '';
  80. }
  81. }
  82. if($flag % $conbine_num != 0 && $flag > 0)
  83. {
  84. file_put_contents($path, md5($fields)."\n", FILE_APPEND);
  85. }
  86. echo "save to file info : ".realpath($path)."\n";
  87. }
  88. }

  

以上就介绍了数据表迁移数据一致性验证,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

人气教程排行