数据库备份技巧

数据库备份技巧

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

参考资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值