首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重构PHP脚本以在两个数据库服务器之间执行mysql更新

重构PHP脚本以在两个数据库服务器之间执行mysql更新
EN

Stack Overflow用户
提问于 2017-09-21 03:40:45
回答 1查看 81关注 0票数 0

我正在尝试完成一个脚本,该脚本连接到两个数据库,每个数据库位于不同的服务器上,并执行更新。基本上,从中选择和插入到的表是相同的:前几天我做了一个转储/导入。该脚本需要保持我的本地表从远程更新一次,因为将有每日记录插入到远程一个,我需要保持它在本地最新。

这里的关键是,我通过查看表共享的自动递增主键SESSIONID来确定远程服务器上的新行。我试图让我的循环在下面说明,如果id存在于远程服务器而不是本地服务器,那么将这些记录插入本地服务器。

我在powershell中输入php 'filename‘来运行下面的脚本,我得到了两条成功的连接消息,但随后它挂起了。大约10分钟后,它有一个内存错误,所以我添加了ini_set('memory_limit', '256M');。在此之后,它仍然会挂起大约10分钟,然后说MySQL服务器已经离开,找不到结果头,这两个错误都发生在我检查$rowCount是否失败的那一行。

注意:在这种情况下,复制和大型转储/导入/表重新创建不是我们的选择。我们有几个类似的脚本在运行,我们希望在这里保持相同的进程。我只是想解决这些错误,或者让别人给我一种更有效的方法来编写这个脚本,可能是使用max id或其他类似的东西。

脚本如下:

代码语言:javascript
复制
      ini_set('memory_limit', '256M');

      // Create connection
      $conn = new mysqli($servername, $username, $password);
      $conn2 = new mysqli($servername2, $username2, $password2);

      // Check connection
      if ($conn->connect_error) {
          die("Connection failed: " . $conn->connect_error);
      }
      echo "Connected successfully";

      // Check connection2
      if ($conn2->connect_error) {
          die("Connection failed: " . $conn2->connect_error);
      }
      echo "Connected successfully";


    //Start queries
    //Select All rows from the source phone database 
      $source_data = mysqli_query($conn, "select * from cdrdb.session");

      // Loop on the results
      while($source_item = $source_data->fetch_assoc()) {

          // Check if row exists in destination phone database
          $row_exists = $conn2->query("SELECT SESSIONID FROM ambition.session WHERE SESSIONID = '".$source_item['SESSIONID']."' ");

              //if query returns false, rows don't exist with that new ID.
              if (!$row_exists){

                    //Insert new rows into ambition.session
                    $conn2->query("INSERT INTO ambition.session (SESSIONID,SESSIONTYPE,CALLINGPARTYNO,FINALLYCALLEDPARTYNO,DIALPLANNAME,TERMINATIONREASONCODE,ISCLEARINGLEGORIGINATING,CREATIONTIMESTAMP,ALERTINGTIMESTAMP,CONNECTTIMESTAMP,DISCONNECTTIMESTAMP,HOLDTIMESECS,LEGTYPE1,LEGTYPE2,INTERNALPARTYTYPE1,INTERNALPARTYTYPE2,SERVICETYPEID1,SERVICETYPEID2,EXTENSIONID1,EXTENSIONID2,LOCATION1,LOCATION2,TRUNKGROUPNAME1,TRUNKGROUPNAME2,SESSIONIDTRANSFEREDFROM,SESSIONIDTRANSFEREDTO,ISTRANSFERINITIATEDBYLEG1,SERVICEEXTENSION1,SERVICEEXTENSION2,SERVICENAME1,SERVICENAME2,MISSEDUSERID2,ISEMERGENCYCALL,NOTABLECALLID,RESPONSIBLEUSEREXTENSIONID,ORIGINALLYCALLEDPARTYNO,ACCOUNTCODE,ACCOUNTCLIENT,ORIGINATINGLEGID,SYSTEMRESTARTNO,PATTERN,HOLDCOUNT,AUXSESSIONTYPE,DEVICEID1,DEVICEID2,ISLEG1ORIGINATING,ISLEG2ORIGINATING,GLOBALCALLID,CADTEMPLATEID,CADTEMPLATEID2,ts,INITIATOR,ACCOUNTNAME,APPNAME,CALLID,CHRTYPE,CALLERNAME,serviceid1,serviceid2)
                    VALUES ('".$source['SESSIONID']."' ,
                            '".$source['SESSIONTYPE']."' ,
                            '".$source['CALLINGPARTYNO']."' ,
                            '".$source['FINALLYCALLEDPARTYNO']."',
                            '".$source['DIALPLANNAME']."',
                            '".$source['TERMINATIONREASONCODE']."',
                            '".$source['ISCLEARINGLEGORIGINATING']."',
                            '".$source['CREATIONTIMESTAMP']."',
                            '".$source['ALERTINGTIMESTAMP']."',
                            '".$source['CONNECTTIMESTAMP']."',
                            '".$source['DISCONNECTTIMESTAMP']."',
                            '".$source['HOLDTIMESECS']."',
                            '".$source['LEGTYPE1']."',
                            '".$source['LEGTYPE2']."',
                            '".$source['INTERNALPARTYTYPE1']."',
                            '".$source['INTERNALPARTYTYPE2']."',
                            '".$source['SERVICETYPEID1']."',
                            '".$source['SERVICETYPEID2']."',
                            '".$source['EXTENSIONID1']."',
                            '".$source['EXTENSIONID2']."',
                            '".$source['LOCATION1']."',
                            '".$source['LOCATION2']."',
                            '".$source['TRUNKGROUPNAME1']."',
                            '".$source['TRUNKGROUPNAME2']."',
                            '".$source['SESSIONIDTRANSFEREDFROM']."',
                            '".$source['SESSIONIDTRANSFEREDTO']."',
                            '".$source['ISTRANSFERINITIATEDBYLEG1']."',
                            '".$source['SERVICEEXTENSION1']."',
                            '".$source['SERVICEEXTENSION2']."',
                            '".$source['SERVICENAME1']."',
                            '".$source['SERVICENAME2']."',
                            '".$source['MISSEDUSERID2']."',
                            '".$source['ISEMERGENCYCALL']."',
                            '".$source['NOTABLECALLID']."',
                            '".$source['RESPONSIBLEUSEREXTENSIONID']."',
                            '".$source['ORIGINALLYCALLEDPARTYNO']."',
                            '".$source['ACCOUNTCODE']."',
                            '".$source['ACCOUNTCLIENT']."',
                            '".$source['ORIGINATINGLEGID']."',
                            '".$source['SYSTEMRESTARTNO']."',
                            '".$source['PATTERN']."',
                            '".$source['HOLDCOUNT']."',
                            '".$source['AUXSESSIONTYPE']."',
                            '".$source['DEVICEID1']."',
                            '".$source['DEVICEID2']."',
                            '".$source['ISLEG1ORIGINATING']."',
                            '".$source['ISLEG2ORIGINATING']."',
                            '".$source['GLOBALCALLID']."',
                            '".$source['CADTEMPLATEID']."',
                            '".$source['CADTEMPLATEID2']."',
                            '".$source['ts']."',
                            '".$source['INITIATOR']."',
                            '".$source['ACCOUNTNAME']."',
                            '".$source['APPNAME']."',
                            '".$source['CALLID']."',
                            '".$source['CHRTYPE']."',
                            '".$source['CALLERNAME']."',
                            '".$source['serviceid1']."',
                            '".$source['serviceid2']."')");
                  }
      }
EN

回答 1

Stack Overflow用户

发布于 2017-09-21 03:56:20

代码语言:javascript
复制
// Check if row exists in destination phone database
$row_exists = $conn2->query("SELECT SESSIONID FROM ambition.session WHERE SESSIONID = '".$source_item['SESSIONID']."' ");

//if query returns false, rows don't exist with that new ID.
if (!$row_exists){

这是不正确的:如果query返回false,则查询无法执行。相反,您需要检查if ($row_exists->num_rows == 0)。按照你现在的代码方式,它总是会一次又一次地插入每条记录。由于没有检查INSERT查询中的错误,因此没有注意到SESSIONID列的重复条目(我假设这也是本地数据库中的主键列)的失败。

另外,如果你只选择你没有的会话,可能会快很多。由于您使用的是自动增量列,因此可以很好地假定远程数据库中任何SESSIONID在本地数据库的最新SESSIONID之后的内容都是新的:

代码语言:javascript
复制
//Start queries
$latest_result = $conn2->query("SELECT MAX(`SESSIONID`) FROM `ambition`.`session`");
$latest_row = $latest->fetch_row();
$latest_session_id = $latest_row[0];

//Select All rows from the source phone database 
$source_data = mysqli_query($conn, "SELECT * FROM `cdrdb`.`session` WHERE `SESSIONID` > $latest_session_id");

默认情况下,MySQL中的表通常是按主键列排序的,但是如果您担心在本地数据库中插入数据的顺序,以防脚本因某种原因而中断,则可以向查询添加一个显式ORDER BY `SESSIONID` ASC

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46330533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档