菜鸟科技网

linux mysql 备份数据库命令

在Linux环境下对MySQL数据库进行备份是系统管理员和开发人员的重要工作,确保数据安全性和可恢复性,MySQL提供了多种备份工具和命令,适用于不同场景和需求,如全量备份、增量备份、逻辑备份和物理备份等,以下是详细的备份命令及使用方法。

linux mysql 备份数据库命令-图1
(图片来源网络,侵删)

使用mysqldump进行逻辑备份

mysqldump是MySQL最常用的逻辑备份工具,可将数据库结构和数据导出为SQL文件,适用于小型到中型数据库,基本语法为:mysqldump [选项] 数据库名 [表名] > 备份文件.sql

  1. 备份单个数据库
    备份整个testdb数据库:

    mysqldump -u root -p testdb > testdb_backup.sql

    执行后会提示输入密码,备份文件包含创建数据库、表结构和INSERT语句。

  2. 备份多个数据库
    使用--databases选项可同时备份多个数据库:

    linux mysql 备份数据库命令-图2
    (图片来源网络,侵删)
    mysqldump -u root -p --databases db1 db2 > multi_db_backup.sql
  3. 备份所有数据库
    通过--all-databases选项备份整个MySQL服务器:

    mysqldump -u root -p --all-databases > all_db_backup.sql
  4. 备份指定表
    若仅需备份testdb中的usersorders表:

    mysqldump -u root -p testdb users orders > tables_backup.sql
  5. 压缩备份文件
    为节省磁盘空间,可通过管道压缩备份文件:

    mysqldump -u root -p testdb | gzip > testdb_backup.sql.gz
  6. 排除某些表
    使用--ignore-table选项跳过特定表,例如备份testdb但排除logs表:

    linux mysql 备份数据库命令-图3
    (图片来源网络,侵删)
    mysqldump -u root -p testdb --ignore-table=testdb.logs > backup_without_logs.sql

使用mysqlhotcopy进行快速备份

mysqlhotcopy适用于MyISAM和Archive引擎的表,通过锁定表并复制文件实现快速物理备份,语法为:mysqlhotcopy [选项] 数据库名 备份目录

示例:

mysqlhotcopy -u root -p testdb /backup/testdb_backup

该命令会直接在/backup目录下创建testdb_backup文件夹,包含表文件(.MYD、.MYI)和结构文件(.frm)。

使用SELECT INTO OUTFILE进行数据导出

若仅需导出表数据(不含结构),可使用SELECT语句结合INTO OUTFILE:

mysql -u root -p -e "SELECT * FROM testdb.users INTO OUTFILE '/tmp/users_data.txt' FIELDS TERMINATED BY ',';"

注意:输出目录需有MySQL服务器写权限,且文件会被服务器直接创建。

增量备份与二进制日志

对于大型数据库,全量备份效率较低,可通过二进制日志(binlog)实现增量备份,首先需在MySQL配置文件中启用binlog:

[mysqld]
log-bin=mysql-bin
binlog-format=ROW
  1. 查看binlog状态

    SHOW MASTER STATUS;

    记录当前binlog文件名和位置(如mysql-bin.000003, 12345)。

  2. 执行增量备份
    全量备份后,后续只需定期备份binlog文件:

    cp /var/lib/mysql/mysql-bin.000003 /backup/
  3. 恢复数据
    恢复时先导入全量备份,再应用binlog:

    mysql -u root -p testdb < testdb_backup.sql
    mysqlbinlog /backup/mysql-bin.000003 | mysql -u root -p

自动化备份脚本

使用cron定时任务可定期执行备份,每天凌晨2点备份testdb并保留7天备份:

#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_DIR="/backup"
mysqldump -u root -p testdb | gzip > $BACKUP_DIR/testdb_$DATE.sql.gz
find $BACKUP_DIR -name "testdb_*.sql.gz" -mtime +7 -delete

将脚本保存为/backup/mysql_backup.sh,并添加到cron:

0 2 * * * /bin/bash /backup/mysql_backup.sh

备份恢复示例

  1. 恢复逻辑备份

    mysql -u root -p testdb < testdb_backup.sql
  2. 恢复压缩备份

    gunzip < testdb_backup.sql.gz | mysql -u root -p testdb

备份命令参数速查表

参数 说明 示例
-u 指定用户名 -u root
-p 提示输入密码 -p
--databases 备份多个数据库 --databases db1 db2
--all-databases 备份所有数据库 --all-databases
--ignore-table 排除指定表 --ignore-table=testdb.logs
--single-transaction 适用于InnoDB,避免锁表 --single-transaction
--master-data 记录binlog位置(增量备份用) --master-data=2

相关问答FAQs

Q1: 如何备份远程MySQL数据库?
A1: 使用mysqldump时通过-h指定主机地址,

mysqldump -h 192.168.1.100 -u root -p testdb > remote_backup.sql

确保远程服务器允许从客户端IP连接,并正确配置防火墙和用户权限。

Q2: 备份时如何避免锁定表,避免影响业务?
A2: 对于InnoDB引擎,使用--single-transaction选项创建事务性备份,避免锁表:

mysqldump -u root -p --single-transaction testdb > backup.sql

但需注意,该选项不适用于MyISAM表,此时可考虑使用--master-data结合binlog实现热备份。

分享:
扫描分享到社交APP
上一篇
下一篇