如何用PHP程序化实现跨数据库批量复制所有表及数据?
批量同步数据库表的PHP实现方案
当然可以!针对你要定期把本地POS数据库的50张表同步到在线数据库的需求,我们可以用PHP自动遍历源库的所有表,完成创建/同步目标表结构、清空目标表数据、复制源表数据的全流程,不用手动写50次重复代码。
实现思路
- 同时建立源数据库(本地POS)和目标数据库(在线)的连接
- 获取源数据库的所有表名
- 循环处理每张表:
- 从源库获取表的创建语句,确保目标表结构和源表完全一致
- 在目标库删除旧表(如果存在)并重建新表
- 将源表的数据批量插入到目标表
完整代码
<?php // -------------------------- 数据库配置 -------------------------- // 源数据库(本地POS系统) $sourceConfig = [ 'host' => 'localhost', 'user' => '你的源库用户名', 'pass' => '你的源库密码', 'dbname' => 'justshawarmapos' ]; // 目标数据库(在线数据分析库) $targetConfig = [ 'host' => '你的在线数据库地址', 'user' => '你的目标库用户名', 'pass' => '你的目标库密码', 'dbname' => 'Kunthanahali' ]; // ---------------------------------------------------------------- // 建立源数据库连接 $sourceConn = new mysqli( $sourceConfig['host'], $sourceConfig['user'], $sourceConfig['pass'], $sourceConfig['dbname'] ); if ($sourceConn->connect_error) { die("源数据库连接失败: " . $sourceConn->connect_error); } // 建立目标数据库连接 $targetConn = new mysqli( $targetConfig['host'], $targetConfig['user'], $targetConfig['pass'], $targetConfig['dbname'] ); if ($targetConn->connect_error) { die("目标数据库连接失败: " . $targetConn->connect_error); } // 获取源数据库的所有表名 $tablesResult = $sourceConn->query("SHOW TABLES"); $tables = []; while ($row = $tablesResult->fetch_row()) { $tables[] = $row[0]; } // 循环处理每张表 foreach ($tables as $table) { echo "正在处理表: {$table} ... "; try { // 临时禁用外键检查(避免删除表时因外键关联报错) $targetConn->query("SET FOREIGN_KEY_CHECKS = 0"); // 1. 获取源表的创建语句 $createStmt = $sourceConn->query("SHOW CREATE TABLE `{$table}`"); $createData = $createStmt->fetch_assoc(); $createSql = $createData['Create Table']; // 2. 删除目标库的旧表(如果存在),并创建与源表一致的新表 $targetConn->query("DROP TABLE IF EXISTS `{$targetConfig['dbname']}`.`{$table}`"); $targetConn->query($createSql); // 3. 批量复制源表数据到目标表 $insertSql = "INSERT INTO `{$targetConfig['dbname']}`.`{$table}` SELECT * FROM `{$sourceConfig['dbname']}`.`{$table}`"; if (!$targetConn->query($insertSql)) { throw new Exception("数据复制失败: " . $targetConn->error); } // 恢复外键检查 $targetConn->query("SET FOREIGN_KEY_CHECKS = 1"); echo "✅ 成功\n"; } catch (Exception $e) { // 出错时也要恢复外键检查 $targetConn->query("SET FOREIGN_KEY_CHECKS = 1"); echo "❌ 失败: {$e->getMessage()}\n"; } } // 关闭数据库连接 $sourceConn->close(); $targetConn->close(); echo "\n所有表处理完成!"; ?>
关键注意事项
- 权限要求:确保源数据库用户拥有
SELECT权限,目标数据库用户拥有CREATE、DROP、INSERT权限 - 性能优化:如果单表数据量极大(比如百万级以上),直接
INSERT SELECT可能会超时,建议分批次插入,或者开启事务提升效率:// 在循环内添加事务 $targetConn->begin_transaction(); try { // 执行创建表、插入数据的操作 $targetConn->commit(); } catch (Exception $e) { $targetConn->rollback(); // 处理错误 } - 定时执行:可以把这个脚本设置为定时任务(Linux用Cron,Windows用任务计划程序),在业务低峰期自动运行,比如每天凌晨2点
- 数据一致性:同步过程中如果本地POS有新数据写入,可能会导致部分数据遗漏,建议同步前给源表加读锁(
LOCK TABLES{$table}READ),同步完成后解锁(UNLOCK TABLES)
内容的提问来源于stack exchange,提问作者Nikeshh Vijayabaskaran
相关产品推荐
相关产品推荐

