PHP一键比对更新MYSQL数据库的一些想法

5 篇文章 0 订阅
3 篇文章 0 订阅

帮一个朋友维护CMS,具体的还要有一键远程匹配数据库的功能。


当时给的需求是:


1.能够一键比对远程服务器上的数据库的表和字段。


2.比对完成后,如果发现某表或者某字段缺失,那么就自动生成sql语句,来重新生成一个“补丁”


开始以为很简单,其实还蛮复杂的。


一开始就要进更新服务器(主服务器),感觉有点主从结构,读写分离的味道,233333;


分配好一个专门用来远程比对的mysql用户,并且设置权限为select.


然后再在所有的“从”服务器的代码里面写上这个用户的帐号密码。


比对的代码如下:


//远程对比表的情况
	function compare(){
		    //链接本地数据库
		mysql_connect(C('DB_HOST'),C('DB_USER'),C('DB_PWD')); 
		mysql_select_db(C('DB_NAME')); //标准的数据库 
		$q = mysql_query("show tables"); 
		while($s = mysql_fetch_array($q)){ 
		$name = $s[0]; 
		$q1 = mysql_query("desc $name"); 
		while ($s1 = mysql_fetch_array($q1)) { 
			$a[$name][] =$s1[0]; 
			} 
		}	 
		mysql_close(); 
		
		//链接远程数据库
		mysql_connect('182.92.109.88','demoweidogs123','demoweidogs123'); 
		mysql_select_db('demoweidogs123');//需要比较的数据库 
		$q2 = mysql_query("show tables"); 
		while($s2 = mysql_fetch_array($q2)){
		$name2= $s2[0]; 
		$q3 = mysql_query("desc $name2"); 
		while ($s3 = mysql_fetch_array($q3)) { 
		$aa[$name2][] =$s3[0]; 
		} 
	}   
		mysql_close(); 

			$f = $e = array(); 
			$str = $fuhao =''; 
			foreach($a as $k=>$v){ 
			if(!is_array($aa[$k])){ 
			$e[] = $k; 
			} 
			else{ 
			if(count($aa[$k]) <> count($v)){ 
			foreach($v as $k1=>$v1){ 
			if(!in_array($v1,$aa[$k])){ 
			$f[$k][] = $v1; 
			 } 
		 } 
	 } 
  } 
 } 

然后可以得出结论是否缺少某个表或者某个字段。


至于后续的更新我们以后再写。



脚本说明: 1、本脚本用于验证升级前后数据比对操作; 2、本脚本执行过程不记录日志(仅升级db部分记录日志); 3、脚本目录结构如下: 一级目录 二级目录 三级目录 四级目录 data_compare--| |--cfg |--存放相关版本修改好的配置文件信息 |--cls_db.pl |--compare.pl |--config |--init.cfg |--data |--存放现网数据dmp文件 |--exp_data.pl |--exp_parameter.pl |--imp_data.pl |--main.pl |--m_manager |--mmsg |--sqlfiles | | | |--存放sql升级文件 | |--update_db.pl | |--updateToVersion.txt | |--versionlist.txt |--package |--sms |--syslib | | |--Config | | |--IniFiles.pm 目录/文件 说明 ----------------- ----------------------------------------------------------------- cfg 存放产品的配置文件信息,方便产品安装与部署 cls_db.pl 用于清理数据库中对象,包括表、视图、存储过程、package等对象 compare.pl 用于数据的比对,并将结果保存到文件 config 存放配置文件init.cfg信息,方便用户配置所需 data 存放现网数据,即dmp文件 exp_date.pl 导出数据 exp_parameter.pl 导出参数数据 imp_data.pl 导入现网数据 main.pl 调用其他的所有的pl脚本 m_manager 存放M模块的相关升级脚本 mmsg 存放彩信网鼓相关升级脚本 package 存放安装包,无需解压的gz或Z包 sms 存放短信网关的相关升级脚本 syslib Perl模块,解决AIX平台未安装Config模块无法从配置文件获取信息问题 user.load 其中user表示当前数据库登录用户,该目录存放比较结果数据文件 ---------------- ------------------------------------------------------------------ ------------------------------------------------------------------------------------ 使用说明 1、准备工作 a)上传升级前后版本安装包到package目录下,无需解压; b)上传产品修改好的,适合当前测试环境的配置文件到cfg目录下; c)上传现网数据文件到data目录下(如果支持现网数据的话); d)修改config目录下init.cfg配置文件 2、执行main.pl脚本 a)自动安装产品,并执行刷库操作; b)自动导出相关数据信息; c)自动比较升级前后数据,并出结果(同时保存一份到user.load目录下)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值