菜鸟科技网

Linux备份数据库有哪些常用命令?

在Linux环境下备份数据库是系统管理和运维中的重要任务,不同类型的数据库(如MySQL、PostgreSQL、MongoDB等)有其专属的备份命令和工具,掌握这些命令能够有效保障数据安全,以下将详细介绍常见数据库的备份方法、命令参数及注意事项。

Linux备份数据库有哪些常用命令?-图1
(图片来源网络,侵删)

MySQL/MariaDB数据库备份

MySQL和MariaDB作为广泛使用的开源关系型数据库,提供了mysqldump工具进行逻辑备份,支持全量备份、增量备份和特定表备份。

基础全量备份

全量备份是指导出数据库中的所有数据,适合定期完整备份场景,基本命令如下:

mysqldump -u [用户名] -p[密码] --all-databases > /backup/mysql_full_backup.sql
  • -u:指定数据库用户名,如root
  • -p:后接密码(注意密码与p之间无空格),或交互式输入密码;
  • --all-databases:备份所有数据库,若需备份单个数据库,替换为数据库名(如mydb);
  • >:将输出重定向到备份文件,建议使用.sql.sql.gz后缀。

压缩备份

为节省存储空间,可在备份时直接压缩文件:

mysqldump -u root -p mydb | gzip > /backup/mydb_backup.sql.gz

或使用--compress参数启用压缩(需MySQL支持):

Linux备份数据库有哪些常用命令?-图2
(图片来源网络,侵删)
mysqldump -u root -p --compress mydb > /backup/mydb_backup.sql

单表备份

仅需备份特定表时,可在数据库名后添加表名:

mysqldump -u root -p mydb table1 table2 > /backup/mydb_tables_backup.sql

排除特定表

备份时需忽略某些表(如日志表),使用--ignore-table参数:

mysqldump -u root -p mydb --ignore-table=mydb.logs > /backup/mydb_no_logs.sql

备份二进制日志(增量备份基础)

MySQL的二进制日志(binlog)可用于增量备份,需先启用binlog(在my.cnf中配置log-bin=mysql-bin),备份binlog的命令:

mysqladmin -u root -p flush-logs  # 生成新的binlog文件
cp /var/lib/mysql/mysql-bin.* /backup/  # 复制binlog文件

结合mysqlbinlog工具可恢复增量数据:

mysqlbinlog /backup/mysql-bin.000001 | mysql -u root -p

参数优化

  • --single-transaction:对于InnoDB引擎,此参数可避免锁表,确保备份期间数据库可正常写入;
  • --routines:包含存储过程和函数;
  • --triggers:包含触发器;
  • --events:包含事件调度器。
    示例:
    mysqldump -u root -p --single-transaction --routines --triggers mydb > /backup/mydb_complete.sql

PostgreSQL数据库备份

PostgreSQL提供pg_dumppg_dumpall工具进行逻辑备份,pg_dumpall适合备份所有数据库(包括角色和权限)。

单数据库备份

pg_dump -U [用户名] -d [数据库名] -f /backup/pgsql_backup.sql
  • -U:指定超级用户(如postgres);
  • -d:指定数据库名,若省略则需通过环境变量PGDATABASE设置;
  • -f:指定输出文件路径。

自定义格式备份

PostgreSQL支持自定义格式(-Fc),压缩效率高且支持增量恢复:

pg_dump -U postgres -Fc -f /backup/pgsql_backup.dump mydb

备份所有数据库

pg_dumpall -U postgres > /backup/pgsql_all_databases.sql

备份期间允许连接

使用--no-password避免交互式输入密码(需配置.pgpass文件),或--if-exists避免表不存在时报错:

pg_dump -U postgres --if-exists mydb > /backup/pgsql_safe.sql

恢复数据

恢复时使用psql命令:

psql -U postgres -d mydb -f /backup/pgsql_backup.sql

MongoDB数据库备份

MongoDB作为NoSQL数据库,使用mongodump工具进行备份,支持全量、增量和快照备份。

全量备份

mongodump --host [主机名] --port [端口] --db [数据库名] --out /backup/mongodb_backup
  • --host:MongoDB服务地址,默认localhost
  • --port:端口,默认27017
  • --db:指定数据库名,若省略则备份所有数据库;
  • --out:输出目录,备份结果以bson格式存储。

压缩备份

添加--gzip参数直接压缩备份文件:

mongodump --db mydb --out /backup/mongodb_backup --gzip

备份集合(表)

mongodump --db mydb --collection users --out /backup/mongodb_users

认证备份(需启用用户认证)

mongodump --host localhost --port 27017 --username admin --password password --db mydb --out /backup/mongodb_auth

恢复数据

使用mongorestore命令:

mongorestore --db mydb --dir /backup/mongodb_backup/mydb

Redis数据库备份

Redis作为内存数据库,支持RDB快照和AOF日志备份,通常通过redis-cli工具操作。

RDB快照备份

RDB是Redis默认的持久化方式,可通过SAVEBGSAVE命令生成快照:

  • SAVE:阻塞式生成快照(不推荐生产环境使用);
  • BGSAVE:后台异步生成快照(推荐)。
    手动触发BGSAVE:
    redis-cli BGSAVE

    快照文件默认保存在Redis配置的dir目录下(如/var/lib/redis/dump.rdb),需定期复制备份文件:

    cp /var/lib/redis/dump.rdb /backup/redis_backup.rdb

AOF日志备份

AOF(Append Only File)记录所有写操作,数据更安全,可通过redis-cli重写AOF文件:

redis-cli BGREWRITEAOF

AOF文件默认为appendonly.aof,备份方式与RDB类似。

备份策略与自动化

定时备份

使用cron实现定时备份,例如每天凌晨2点备份MySQL数据库:

0 2 * * * mysqldump -u root -p'password' mydb | gzip > /backup/mysql_$(date +\%Y\%m\%d).sql.gz

注意:密码明文存储不安全,建议使用.my.cnf配置文件(设置[client]段的password,权限设为600)。

备份文件管理

  • 定期清理旧备份(如保留30天),避免磁盘占满:
    find /backup -name "*.sql.gz" -mtime +30 -delete
  • 备份文件异地存储,避免单点故障。

备份验证

定期测试备份文件的可用性,例如恢复MySQL备份:

mysql -u root -p mydb < /backup/mysql_backup.sql

常见数据库备份命令对比

数据库 备份工具 全量备份示例 压缩选项 增量备份支持
MySQL/MariaDB mysqldump mysqldump -u root -p mydb > backup.sql | gzip Binlog
PostgreSQL pg_dump pg_dump -U postgres mydb > backup.sql -Fc 无(需第三方工具)
MongoDB mongodump mongodump --db mydb --out backup --gzip 是(oplog)
Redis redis-cli redis-cli BGSAVE 手动压缩 RDB/AOF

相关问答FAQs

Q1: MySQL备份时出现“mysqldump: Got error: 1449: The user specified as a definer does not exist”错误,如何解决?
A: 该错误通常因备份的存储过程或函数中使用了不存在的DEFINER用户导致,解决方法:

  1. 使用--skip-definer参数跳过DEFINER定义:
    mysqldump -u root -p --skip-definer mydb > backup.sql
  2. 或修改存储过程,将DEFINER改为当前用户:
    mysql -u root -p mydb -e "ALTER PROCEDURE procedure_name DEFINER = CURRENT_USER;"

Q2: 如何在Linux中实现MongoDB的增量备份?
A: MongoDB可通过oplog(操作日志)实现增量备份,步骤如下:

  1. 确保MongoDB已启用oplog(默认启用,存储大小通常为磁盘空间的5%):
    rs.status()  # 检查oplog信息
  2. 使用mongodump--oplog参数备份oplog:
    mongodump --db mydb --out /backup/incremental --oplog
  3. 恢复时先恢复全量备份,再应用oplog:
    mongorestore --db mydb /backup/full_backup/mydb  
    mongorestore --oplogRecover --db mydb /backup/incremental

    注意:增量备份需基于全量备份,且oplog需保留足够时间。

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