为了数据安全,定时备份自己的数据库是必要的,当然,你不可能每次都手动备份,这样不仅麻烦,而且,万一忘记备份,出现问题就完蛋了。 所以我使用一个定时cron任务来自动化这个过程。
创建脚本文件backupdb.sh
将下面脚本的db_user
db_passwd
db_name
backup_name
替换为自己的信息。
#!/bin/bash
db_user="username"
db_passwd="pwd"
db_name="dbname"
backup_name="$(date +"%Y%m%d%H%M%S")"
/usr/bin/mysqldump -u$db_user -p$db_passwd $db_name >> /path/to/$backup_name.sql
添加执行权限
chmod +x backupdb.sh
创建cron定时任务
-
执行crontab -e,提示你选择编辑器,你可以根据个人喜好选择(我选择的是vim
```bash no crontab for admin - using an empty one
Select an editor. To change later, run 'select-editor'. 1. /bin/nano <---- easiest 2. /usr/bin/vim.basic 3. /usr/bin/vim.tiny 4. /bin/ed
Choose 1-4 [1]: 2 ```
-
然后在弹出的编辑页面输入以下内容:
bash 0 1 * * * /home/admin/backupdb.sh
上面这行内容的意思是,每天凌晨1点执行/home/admin/backupdb.sh
。当然你可以根据自己的情况选择备份的频率,关于cron的使用,可以参考我之前写的这篇文章。
p.s.可能会提示以下内容,但不影响备份:
mysqldump: [Warning] Using a password on the command line interface can be insecure.
提示mysqldump进程权限错误
提示以下内容:
mysqldump: Error: 'Access denied; you need (at least one of) the PROCESS privilege(s) for this operation' when trying to dump tablespaces
说明使用的user没有该数据库的权限,解决方案有2个。
- 更新数据库用户的权限。
- 使用mysqldump该--no-tablespaces选项运行。
方法1:更新用户权限 > 为用户授予 PROCESS 权限可能是修复mysqldump进程权限错误的最简单选项。但是会带来安全问题。
以管理员用户身份登录数据库,授予你需要使用的用户PROCESS权限:
GRANT PROCESS ON *.* TO user@localhost;
p.s. PROCESS 是全局级别的权限。它不能应用于单个数据库。全局权限要么是管理权限,要么适用于 MySQL 服务器上的所有数据库。尝试在单个数据库上授予它们会显示以下错误:
ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
要向所有数据库授予权限,您必须使用 ON *.* ...
语法。
方法2:使用--no-tablespaces
选项
如果你不想为使用的用户分配全局级别的权限,则必须在转储数据库时指定--no-tablespaces
选项。
mysqldump --no-tablespaces -u user -ppass dbname >> backupfile.sql
赋予PROCESS权限的安全问题
根据MySQL文档,[PROCESS权限]控制着会话正在执行的语句对信息的访问。
这是一种服务器管理权限,所以最好授予所有用户。这是因为它可能会显示当前正在执行的查询中的文本。因此,任何具有 PROCESS 权限的用户都可以看到其他人发出的查询。例如类似 UPDATE user SET password=PASSWORD
的查询,可能会显示隐私内容。