As a developer, I have experienced changes in app when it is in production and the records have grown up to millions. In this specific case if you want to alter a column using simple migrations that will not work because of the following reasons:
It is not so easy if your production servers are under heavy load and the database tables have 100 million rows. Because such a migration will run for some seconds or even minutes and the database table can be locked for this time period – a no-go on a zero-downtime environment.
In this specific case you can use MySQL’s algorithms: Online DDL operations. That’s how you can do it in Laravel.
First of all create migration. For example I want to modify a column’s name the traditional migration will be:
Schema::table('users', function (Blueprint $table) {
$table->renameColumn('name', 'first_name');
});
Run the following command php artisan migrate –pretend this command will not run the migration rather it will print out it’s raw sql:
ALTER TABLE users CHANGE name first_name VARCHAR(191) NOT NULL
Copy that raw sql, remove following code:
Schema::table('users', function (Blueprint $table) {
$table->renameColumn('name', 'first_name');
});
Replace it with following in migrations up method:
\DB::statement('ALTER TABLE users CHANGE name first_name VARCHAR(191) NOT NULL');
Add desired algorithm, in my case query will look like this:
\DB::statement('ALTER TABLE users CHANGE name first_name VARCHAR(191) NOT NULL, ALGORITHM=INPLACE, LOCK=NONE;');
#laravel #mysql #php #alter heavy tables in production laravel #alter table in production laravel #alter tables with million of records in laravel #how to alter heavy table in production laravel #how to alter table in production larave #mysql online ddl operations