inigopascall / clone-db
用于通过按外键依赖关系排序表和运行批量插入来克隆中等大小的数据库的包
This package is auto-updated.
Last update: 2024-09-06 06:48:47 UTC
README
该包是为了解决在连接之间克隆中等/大型数据库的问题而创建的,例如将实时数据库(或其子集)拉取到预发布或开发环境中,在这些环境中需要处理真实数据。大的SQL转储文件通常太大,无法一次性导入,可能会遇到内存限制(数据包大小)问题,尤其是在微服务器上。虽然这是一个老问题,但处理它的简单方法仍然很少。该包试图提供一个开箱即用的解决方案,以Laravel包的形式提供一个新的 artisan 命令,用于克隆一个数据库到另一个。
- 通过自动按外键依赖关系排序表,首先创建'master'表,然后依次创建依赖表,并忽略自脚本启动以来添加到后者的新行来尝试保持数据完整性并避免外键约束错误。(注意,不支持相互依赖的数据集)。
- 通过'分块'数据避免php/mysql内存限制,即以可配置的批量大小选择和插入。
显然,运行此脚本会破坏数据。请在开始之前确保已备份所有相关数据库。
说明
composer require inigopascall/clone-db
php artisan vendor:publish --provider="InigoPascall\CloneDB\Providers\CloneDBProvider"
1. 根据需要配置配置文件
app/config/clone-db.php
已预置合理的默认值,在该文件的注释中给出了如何根据您的需求调整参数的示例。
2. 确保在应用程序的配置中正确配置了源数据库和目标数据库
app/config/database.php
'my_source_db_connection' => [
'driver' => 'mysql',
'host' => env('SOURCE_DB_HOST', '127.0.0.1'),
'port' => env('SOURCE_DB_PORT', '3306'),
'database' => env('SOURCE_DB_DATABASE', 'forge'),
'username' => env('SOURCE_DB_USERNAME', 'forge'),
'password' => env('SOURCE_DB_PASSWORD', '')
],
'my_target_db_connection' => [
'driver' => 'mysql',
'host' => env('TARGET_DB_HOST', '127.0.0.1'),
'port' => env('TARGET_DB_PORT', '3306'),
'database' => env('TARGET_DB_DATABASE', 'forge'),
'username' => env('TARGET_DB_USERNAME', 'forge'),
'password' => env('TARGET_DB_PASSWORD', '')
]
.env
SOURCE_DB_HOST=localhost
SOURCE_DB_PORT=3306
SOURCE_DB_DATABASE=source_database_name
SOURCE_DB_USERNAME=mysqlusername
SOURCE_DB_PASSWORD=mysluserpass
TARGET_DB_HOST=localhost
TARGET_DB_PORT=3306
TARGET_DB_DATABASE=target_database_name
TARGET_DB_USERNAME=mysqlusername
TARGET_DB_PASSWORD=mysqluserpass
3. 使用源数据库连接名称和目标数据库连接名称作为参数运行命令。检查并确认输出。
php artisan db:clone my_source_db_connection my_target_db_connection
通过SSH克隆远程数据库
指向私有密钥位置的SSH服务器配置
~/.ssh/config
Host remoteservername
Hostname {server ip address}
User username
IdentityFile ~/.ssh/remoteservernameprivatekey
使用以下命令打开SSH连接:ssh remoteservername -N -L 13306:localhost:3306 username@{server ip address}
连接条目将设置为localhost和上述命令中指定的本地端口号(13306)。
'my_source_db_connection' => [
'driver' => 'mysql',
'host' => env('SOURCE_DB_HOST', '127.0.0.1'),
'port' => env('SOURCE_DB_PORT', '13306'),
'database' => env('SOURCE_DB_DATABASE', 'remotedb'),
'username' => env('SOURCE_DB_USERNAME', 'remotedbuser'),
'password' => env('SOURCE_DB_PASSWORD', 'remotedbpass')
]