数据库备份技巧
MYSQLDUMP 命令
mysqldump
A Database Backup Program
数据库备份程序
参数:
-h 主机名
-u 用户名
-p 密码
-P 端口
--socket 指定 unix socket 文件
选项:
--all-database 选择全部数据库
--databases 指定要导出数据库(多个使用空格分开)
--single-transaction 事务备份(使用这个参数之后,会开启一个事务来备份,不会锁表锁库)
--no-data 不备份数据
备份示例
导出全部数据到标准输出
mysqldump -uhomestead -psecret --socket=/var/run/mysqld/mysqld.sock --all-databases
导出某个数据库到标准输出
mysqldump -uhomestead -psecret -h127.0.0.1 DMA
导出多个数据库到标准输出
mysqldump -uhomestead -psecret -h127.0.0.1 --databases DMA dma2
导出全部的数据到文件
mysqldump -uhomestead -psecret -h127.0.0.1 --all-databases > backup.sql
导出指定某数据库的部分表到标准输出
mysqldump -uhomestead -psecret -h127.0.0.1 DMA users admin_users
导出指定的数据库到文件
mysqldump -uhomestead -psecret -h127.0.0.1 DMA > backup.sql
导出指定的表到文件并且压缩
mysqldump -uhomestead -psecret --socket=/var/run/mysqld/mysqld.sock DMA |gzip > back.sql.gz
恢复示例
> create database DMA-back;
> use DMA-back;
> source backup.sql
Laravel 命令行定时备份
创建命令行
php artisan make:command BackupDatabase
实现备份
class BackupDatabase extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'db:backup';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Backup the database';
private $process;
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
/**
* The Process class executes a command in a sub-process, taking care of the differences between operating system and escaping arguments to prevent security issues. It replaces PHP functions like exec, passthru, shell_exec and system
*
* Process 在子进程执行命令
* - 屏蔽操作系统差别的细节
* - 过滤危险字符串
* - 可代替 shell shell_exec system passthru 等命令
*/
$this->process = new Process(sprintf("mysqldump -u%s -p%s %s > %s",
config('database.connections.mysql.username'),
config('database.connections.mysql.password'),
config('database.connections.mysql.database'),
storage_path('backups/backup-' . date('Y-m-d_H-i-s') . '.sql'))
);
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
try{
/**
* run() 需要自己判断是否成功
*
* mustRun() 会自动抛出异常
*/
$this->process->mustRun();
$this->info('The backup has been processed successfully.');
} catch (ProcessFailedException $e) {
$this->info('The backup has been failed: ' . $e->getMessage());
} catch (ProcessTimedOutException $e){
$this->info('The backup has been Timeout: ' . $e->getMessage());
}
}
}
计划任务
文件位置:app/Console/Kernel.php
protected function schedule(Schedule $schedule)
{
// 备份数据库
$schedule->command(BackupDB::class)->dailyAt('23:50');
// 额度释放
$schedule->command(CreditRelease::class)->dailyAt('23:59');
}
上传到 OSS(TODO)
留个作业:
- 利用项目中的 OSSHelper 将文件上传到 OSS
- 仓库:zhixiu-backup
- 文件名:<Gitlab项目名>-<日期>.sql.tar.gz
如:Met-DMA-Base-Api-2019-07-22.sql.tar.gz
补充
查找 mysql.sock
> netstat -ln | grep mysql
unix 2 [ ACC ] STREAM LISTENING 23045 /var/run/mysqld/mysqld.sock
Gzip 压缩解压文件
> gzip backup.sql
> tar -zcvf backup.sql.tar.gz backup.sql
> tar -zxvf backup.sql.tar.gz
> gunzip backup.sql.gz
获取 Linux 当前时间
> date +%Y%m%d
20190723
%Y 年,如 2019
%m 月,如 07
%d 日:如 23