l-alexandrov / laravel-zero-downtime-migration
Requires
- php: ^7.0|^8.0|^8.1
- illuminate/database: ~5.5.0|~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0|^8.0|^9.0
- illuminate/support: ~5.5.0|~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0|^8.0|^9.0
- symfony/console: ^3.3|^4.0|^5.0|^6.0
- symfony/process: ^3.3|^4.0|^5.0|^6.0
Requires (Dev)
- phpunit/phpunit: ^7.2|^8.4|^9.5
- squizlabs/php_codesniffer: ^3.3
Conflicts
This package is auto-updated.
Last update: 2023-05-23 08:57:33 UTC
README
使用 Laravel 和 gh-ost
或 pt-online-schema-change
进行无停机迁移。
注意:仅与 MySQL 数据库兼容,包括(Percona & MariaDB)。
安装
兼容 Laravel 5.5
,5.6
,5.7
,5.8
,6.0
,7.0
,8.0
& 9.0
先决条件
如果你使用 gh-ost
,请确保从他们的发布页面下载二进制文件
如果你使用 pt-online-schema-change
,请确保已安装 percona-toolkit
。
- 在 Mac 上,你可以使用 brew 安装它:
brew install percona-toolkit
。 - 在 Debian/Ubuntu 上
apt-get install percona-toolkit
。
安装步骤
- 运行
composer require l-alexandrov/laravel-zero-downtime-migration
- (可选) 如果你没有使用自动加载,请将服务提供者添加到你的
config/app.php
文件中。
LAlexandrov\ZeroDowntimeMigration\ServiceProvider::class,
- 更新你的
config/database.php
并添加新的连接
此包支持 pt-online-schema-change
和 gh-ost
。以下是每个包的配置
gh-ost
'connections' => [ 'zero-downtime' => [ 'driver' => 'gh-ost', // This is your master write access database connection details 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), // Additional options, depending on your setup // all options available here: https://github.com/github/gh-ost/blob/master/doc/cheatsheet.md 'options' => [ '--max-load=Threads_running=25', '--critical-load=Threads_running=1000', '--chunk-size=1000', '--throttle-control-replicas=myreplica.1.com,myreplica.2.com', '--max-lag-millis=1500', '--verbose', '--switch-to-rbr', '--exact-rowcount', '--concurrent-rowcount', '--default-retries=120', ], ], ],
pt-online-schema-change
'connections' => [ 'zero-downtime' => [ 'driver' => 'pt-online-schema-change', // This is your master write access database connection details 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), // Additional options, depending on your setup // all options available here: https://www.percona.com/doc/percona-toolkit/LATEST/pt-online-schema-change.html 'options' => [ '--nocheck-replication-filters', '--nocheck-unique-key-change', '--recursion-method=none', '--chunk-size=2000', ], ], ],
用法
在编写新迁移时,使用辅助门面 ZeroDowntimeSchema
而不是 Laravel 的 Schema
,所有命令都将通过 gh-ost
或 pt-online-schema-change
运行。
<?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; use LAlexandrov\ZeroDowntimeMigration\ZeroDowntimeSchema; class AddPhoneNumberToUsersTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { ZeroDowntimeSchema::table('users', function (Blueprint $table) { $table->string('phone_number')->nullable(); }); } /** * Reverse the migrations. * * @return void */ public function down() { ZeroDowntimeSchema::table('users', function (Blueprint $table) { $table->dropColumn('phone-number'); }); } }
运行 php artisan:migrate
配置
所有配置都在连接本身的 config/database.php
内进行。你可以将自定义标志传递给原始的 pt-online-schema-change
命令。只需在 options
数组中添加你想要的参数即可,如下所示
'options' => [ '--nocheck-replication-filters', '--nocheck-unique-key-change', '--recursion-method=none', '--chunk-size=2000', ]
你可以在以下位置找到所有可能的选项:https://www.percona.com/doc/percona-toolkit/LATEST/pt-online-schema-change.html
测试
ZeroDowntimeSchema
门面允许你在测试期间禁用 pt-online-schema-change
的运行。要这样做,在你的基本测试用例 TestCase.php
下的 setUp
方法中添加以下内容
public function setUp() { // ... existing code ZeroDowntimeSchema::disable(); }
这将禁用 pt-online-schema-change
,并且使用辅助门面运行的所有迁移将通过默认的 Laravel 迁移器运行。
自定义连接名称
默认情况下,ZeroDowntimeSchema
辅助使用的连接名称设置为 zero-downtime
,但是如果你在 config/database.php
中将连接名称设置为其他名称,则可以覆盖此设置。
要这样做,在你的 AppServiceProvider.php
中,在 boot()
方法下添加以下内容
public function boot() { // ... existing code ZeroDowntimeSchema::$connection = 'your-custom-name'; }
复制
如果你的数据库在一个带有复制的集群中运行,那么你需要配置pt-online-schema-changes
如何找到你的复制从节点。以下是一个示例设置,但请根据您的需求进行自定义。
'options' => [ '--nocheck-replication-filters', '--nocheck-unique-key-change', '--recursion-method=dsn=D=database_name,t=dsns', '--chunk-size=2000', ]
- 将
database_name
替换为您的数据库名称。 - 创建一个名为
dsns
的新表。
CREATE TABLE `dsns` ( `id` int(11) NOT NULL AUTO_INCREMENT, `parent_id` int(11) DEFAULT NULL, `dsn` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB;
- 为每个您拥有的复制添加一行,例如
INSERT INTO `dsns` (`id`, `parent_id`, `dsn`) VALUES (1, NULL, 'h=my-replica-1.example.org,P=3306');
注意事项
- 此方法仅适用于MySQL、Percona和MariaDB。
- 当您需要更改表结构时使用此工具,而不是在创建或删除表时使用。