Easily archive your Laravel database tables periodically to keep your application database lean and performant.
Laravel DB Archive is a package that provides a simple and efficient way to archive old records from your database tables in Laravel applications. It helps maintain your application's database performance by moving historical data to archive tables, while keeping your primary tables focused on recent and relevant information.
Laravel 10.x and above
ArchivesData trait to easily access archived records from your modelsYou can install the package via composer:
composer require ringlesoft/db-archive
Publish the configuration file with:
php artisan vendor:publish --provider="RingleSoft\DbArchive\DbArchiveServiceProvider" --tag="config"
Define your archive database connection in your config/database.php file. You can easily do this by clonning your default database and changing its properties. For example:
'databases' => [
...,
'mysql_archive' => [
'driver' => 'mysql',
'host' => 'localhost',
'port' => '3306',
'database' => 'archive_database',
'username' => 'root',
'password' => 'password',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
],
],
After this, use the ARCHIVE_DB_CONNECTION environment variable to specify the connection name for archive operations.
ARCHIVE_DB_CONNECTION=mysql_archive
In your config/db_archive.php file, define the tables you want to archive and their associated settings. For example:
'tables' => [
'orders',
'activity_logs',
'audit_trail'
],
Run the setup command to create the archive database and tables:
php artisan db-archive:setup
You can now start archiving your data using the archive command or by scheduling it using a cron job.
You can also implement the ArchivesData trait in your models to access their archived records.
connection:config/database.php file.mysql_archive and can be overridden using the ARCHIVE_DB_CONNECTION environment variable.settings:table_prefix:
null for no prefix.batch_size:
date_column:
created_at, updated_at).created_at.archive_older_than_days:
date_column older than this value will be archived.365 days .conditions:
[].[['status', 'active']] or [['id', '<=', 100]]primary_id:
id; it must be unique in both source and archive tables.soft_delete:
true to retain archived source rows and mark them as deleted instead of removing them. (Defies the purpose of the package though!)false.soft_delete_column:
soft_delete is enabled.deleted_at.enable_logging:notifications:email:
admin@example.com.tables:To setup the package, run the following command:
php artisan db-archive:setup
This will create the backup database and tables if not already present. The command uses the schema of the original tables to create the archive tables.
If the tables already exist, it will skip the setup process. To overwrite the existing tables, use the --force option:
php artisan db-archive:setup --force
In interactive mode, replacing archive tables requires confirmation. Preview setup work without database changes with:
php artisan db-archive:setup --dry-run
php artisan queue:table
php artisan migrate
php artisan queue:batches-table
php artisan migrate
Run the archive command to process tables defined in your configuration:
php artisan db-archive:archive
This command will:
db-archive.php configuration file.TableArchiver::archiveWithResult() returns an ArchiveResult containing scanned, archived, and removed row counts. The package also dispatches TableArchived and TableArchivingFailed events, each containing that result, so applications can attach metrics or audit listeners.
To automate the archiving process, schedule the db-archive:archive command in your Kernel.php file:
// app/Console/Kernel.php
protected function schedule(Schedule $schedule)
{
$schedule->command('db-archive:archive')->dailyAt('01:00'); // Run daily at 1:00 AM
}
Adjust the scheduling as per your requirements (e.g., daily, weekly, monthly).
(Archive orders table with default settings)
// config/db_archive.php
'connection' => 'mysql_archive',
...
'tables' => [
'orders',
'comments'
],
This configuration will archive records from the orders and comments tables from your default connection that are older than 365 days (based on the created_at column) to orders and comments tables in the mysql_archive connection database.
// config/db_archive.php
'connection' => 'mysql_archive',
...
'tables' => [
'orders' => [
'archive_older_than_days' => 90, // Archive orders older than 90 days
'date_column' => 'order_date', // Use 'order_date' column for age check
'batch_size' => 5000, // Process in batches of 5000
'conditions' => [ // Additional conditions
['status', '=', 'completed'],
],
],
];
This configuration will archive records from the orders table that are older than 90 days (based on the order_date column), processed in batches of 5000, and only for orders with a status of 'completed'.
Enjoy!
Contributions are welcome! Please feel free to submit pull requests or open issues to suggest improvements or report bugs.
The Laravel DB Archive package is open-sourced software licensed under the MIT license.
Follow me on X: @ringunger Email me: ringunger@gmail.com Website: https://ringlesoft.com
How can I help you explore Laravel packages today?