1、mysqldump命令
mysqldump 是 mysql 用于转存储数据库的实用程序。它主要产生一个 SQL 脚本,其中包含从头重新创建数据库所必需的命令 CREATE TABLE INSERT 等。
命令:mysqldump -h主机地址 -u用户名 -p数据库密码 数据库名 表1 表2 > 文件名
如果用户名需要密码,则需要在此命令执行后输入一次密码核对;如果数据库用户名不需要密码,则不要加“-p”参数,导入的时候相同。注意输入的用户名需要拥有对应数据库的操作权限,否则无法导出数据。由于是作系统维护和全部数据库的导出,一般我们使用root等超级用户权限。
其他命令参考
备份远程MySQL数据库的命令
mysqldump -hhostname -uusername -ppassword databasename > backupfile.sql
备份MySQL数据库为带删除表的格式备份MySQL数据库为带删除表的格式,能够让该备份覆盖已有数据库而不需要手动删除原有数据库。
mysqldump ---add-drop-table -uusername -ppassword databasename > backupfile.sql
直接将MySQL数据库压缩备份
mysqldump -hhostname -uusername -ppassword databasename | gzip > backupfile.sql.gz
备份MySQL数据库某个(些)表
mysqldump -hhostname -uusername -ppassword databasename specific_table1 specific_table2 > backupfile.sql
同时备份多个MySQL数据库
mysqldump -hhostname -uusername -ppassword --databases databasename1 databasename2 databasename3 > multibackupfile.sql
仅仅备份数据库结构
mysqldump --no-data --databases databasename1 databasename2 databasename3 > structurebackupfile.sql
备份服务器上所有数据库
mysqldump --all-databases allbackupfile.sql
还原MySQL数据库的命令
mysql -hhostname -uusername -ppassword databasename < backupfile.sql
还原压缩的MySQL数据库
gunzip < backupfile.sql.gz | mysql -uusername -ppassword databasename
2、crontab命令
crontab命令用于设置周期性被执行的指令,并将其存放在/etc/crontab文件,以供之后读取和执行。cron系统调度进程,可以使用它在每天的非高峰负荷段运行作业,或在一周或一月中不同时段运行,cron是系统主要的调度进程,可以无需人工干预的情况下运行作业。
详细内容请参考《Linux Crontab 定时任务》
crontab的使用
crontab [-u username] //省略用户表表示操作当前用户的crontab
-e (编辑工作表)
-l (列出工作表里的命令)
-r (删除工作作)
我们用crontab -e进入当前用户的工作表编辑,是常见的vim界面。每行是一条命令。
crontab的命令构成为 时间+动作,其时间有分、时、日、月、周五种,操作符有
示例:
[root@xxx soft]# crontab -l
0 2 * * * bash /usr/soft/mysql_backup.sh? #每天凌晨2点执行一次
*/1 * * * * bash /usr/soft/mysql_backup.sh? # 每分钟执行一次
3、实践
通过前面的了解,我们基本上知道了mysql导出命令mysqldump 和 Linux定时命令crontab的用法了,现在我们就来尝试实现定期备份指定数据库中指定表的命令。
1、备份脚本
首先,创建mysql_backup.sh文件,定义备份数据库的脚本,实现如下:
#!/bin/bash
#备份位置
backup_dir='/usr/data/backup/mysql/'
#获取当前时间
current_time=$(date +'%Y-%m-%d_%H%M%S')
#将backup_dir和时间组合起来,再加个后缀
filepath=$backup_dir$current_time'.sql.gz'
#数据库信息,配置数据库账号密码
s_ip='127.0.0.1'
username='root'
password='xxx'
source_database='xxx'
echo "-----------------------"$(date +%F%r)"操作开始--------------------------------"
echo $(date +%F%r)"开始进行数据备份..."
# 2>/dev/null 可以抑制警告信息
mysqldump -h${s_ip} -P3306 -u ${username} -p"${password}" ${source_database} table1 table2 table3 | gzip > $filepath
echo $(date +%F%r)"完成同步..."
上述脚本实现了,备份s_ip主机上的source_database数据库,且只备份table1、table2、table3三个数据表,并以gzip格式进行压缩,存储路径为backup_dir。
2、异常处理
注意: 出现 “/bin/bash^M: bad interpreter: No such file or directory”报错
因为一般情况下,脚本会在windows环境下编写,这个时候,辅上传到Linux系统时,可能会出现“/bin/bash^M: bad interpreter: No such file or directory”错误,这是由于shell脚本文件是dos格式,即每一行结尾以\r\n来标识,而unix格式的文件行尾则以\n来标识。解决办法:
- 查看脚本的格式: cat -A filename
从显示结果可以判断,dos格式的文件行尾为^M$,unix格式的文件行尾为$。 - 修改脚本的格式:
vi filename打开文件,执行 : set ff=unix设置文件为unix,然后执行:wq,保存成unix格式。 - 查看脚本的格式: cat -A filename
从显示结果可以判断,dos格式的文件行尾为^M$,unix格式的文件行尾为$。
执行脚本出现:“-bash: ./mysql_backup.sh: Permission denied”异常
该报错,是没有给脚本进行授权,命令如下:
chmod u+x mysql_backup.sh
执行脚本出现:“./mysql_backup.sh: line 19: /usr/data/backup/mysql/2022-04-28_150941.sql.gz: No such file or directory”异常
该报错是,备份脚本中的路径,在Linux系统中不存在,这个时候,需要创建对应的目录即可,文件会自动生成。
3、创建定时任务
完成了上述步骤,脚本就完成了创建,并可以正常使用了,下面就是创建定时任务了。
在Linux系统中,执行“crontab -e”命令,进入定时任务编辑界面,编辑需要定时命令即可,如下所示:
编辑保存后,查看任务如下: