如何同时连接本地与远程数据库实现数据同步并解决连接报错?
解决本地与远程数据库同步插入的问题
首先咱们先搞定你遇到的连接报错:
Database connection failed: php_network_getaddresses: getaddrinfo failed: Name or service not known
这个错误说明PHP没法解析你填的远程IP 12.345.678.999,大概率是下面几个原因:
- 你输入的IP格式无效:正常IP是四段0-255的数字,比如
12.34.56.78,你写的12.345.678.999里345、678、999都超过了255,先确认远程服务器的真实公网IP - 远程数据库未开放访问权限:要么防火墙拦截了3306端口,要么MySQL用户
dbuser2只允许本地访问,需要给该用户授权允许从本地服务器IP连接,比如执行SQL:GRANT ALL ON dbname2.* TO 'dbuser2'@'你的本地服务器公网IP' IDENTIFIED BY 'dbpass2'; - 远程数据库修改了默认端口:如果不是3306,需要在mysqli连接时补充端口参数,比如
new mysqli($DB_HOST2, $DB_USER2, $DB_PASS2, $DB_NAME2, 3307);
正确实现同步插入的方案
当连接问题解决后,要实现本地INSERT同步到远程同结构表,必须用事务包裹两个插入操作,避免出现本地插入成功但远程失败的数据不一致情况。下面是完整的示例代码:
<?php // 本地数据库连接配置 $localConfig = [ 'host' => 'localhost', 'user' => 'dbuser1', 'pass' => 'dbpass1', 'dbname' => 'dbname1', 'port' => 3306 ]; $mysqliLocal = new mysqli( $localConfig['host'], $localConfig['user'], $localConfig['pass'], $localConfig['dbname'], $localConfig['port'] ); if ($mysqliLocal->connect_errno) { die("本地数据库连接失败: " . $mysqliLocal->connect_error); } // 远程数据库连接配置(替换为正确的IP信息) $remoteConfig = [ 'host' => '12.34.56.78', 'user' => 'dbuser2', 'pass' => 'dbpass2', 'dbname' => 'dbname2', 'port' => 3306 ]; $mysqliRemote = new mysqli( $remoteConfig['host'], $remoteConfig['user'], $remoteConfig['pass'], $remoteConfig['dbname'], $remoteConfig['port'] ); if ($mysqliRemote->connect_errno) { die("远程数据库连接失败: " . $mysqliRemote->connect_error); } // 开启事务保证数据一致性 try { // 关闭自动提交 $mysqliLocal->autocommit(false); $mysqliRemote->autocommit(false); // 示例插入数据(实际根据业务逻辑获取) $insertData = [ 'username' => 'test_user', 'email' => 'test@example.com', 'age' => 28 ]; // 本地插入:用预处理语句防止SQL注入 $localStmt = $mysqliLocal->prepare("INSERT INTO users (username, email, age) VALUES (?, ?, ?)"); $localStmt->bind_param("ssi", $insertData['username'], $insertData['email'], $insertData['age']); $localStmt->execute(); // 远程插入:同结构表,字段与本地一致 $remoteStmt = $mysqliRemote->prepare("INSERT INTO users (username, email, age) VALUES (?, ?, ?)"); $remoteStmt->bind_param("ssi", $insertData['username'], $insertData['email'], $insertData['age']); $remoteStmt->execute(); // 提交事务 $mysqliLocal->commit(); $mysqliRemote->commit(); echo "数据同步插入成功!"; } catch (Exception $e) { // 出错则回滚所有操作 $mysqliLocal->rollback(); $mysqliRemote->rollback(); die("插入失败: " . $e->getMessage()); } finally { // 恢复自动提交并关闭连接 $mysqliLocal->autocommit(true); $mysqliRemote->autocommit(true); $localStmt->close(); $remoteStmt->close(); $mysqliLocal->close(); $mysqliRemote->close(); } ?>
额外优化建议
- 避免频繁建立连接:如果站点流量大,每次请求都创建远程连接会消耗资源,可以改用连接池,或者把同步操作放到异步队列(比如Redis队列)后台处理,不影响用户请求响应速度
- 优先用数据库原生复制:如果是MySQL,推荐配置主从复制(本地为主库,远程为从库),这比PHP代码同步更高效、更可靠,适合数据量大的场景
- 增加日志记录:同步过程中记录操作日志,包括插入时间、数据内容、执行结果等,方便后续排查问题
内容的提问来源于stack exchange,提问作者bodesam
相关产品推荐
相关产品推荐

