备份数据库、恢复数据库、定时
MySQL mysqldump备份数据库(附带实例):http://c.biancheng.net/view/7373.html
MySQL恢复数据库(mysql命令):http://c.biancheng.net/view/7381.html
备份数据库
备份一个数据库
使用 mysqldump 命令备份一个数据库的语法格式如下:
mysqldump -u username -p dbname [tbname ...]> filename.sql
对上述语法参数说明如下:
- username:表示用户名称;
- dbname:表示需要备份的数据库名称;
- tbname:表示数据库中需要备份的数据表,可以指定多个数据表。省略该参数时,会备份整个数据库;
- 右箭头“>”:用来告诉 mysqldump 将备份数据表的定义和数据写入备份文件;
- filename.sql:表示备份文件的名称,文件名前面可以加绝对路径。通常将数据库备份成一个后缀名为
.sql
的文件。
注意:mysqldump 命令备份的文件并非一定要求后缀名为.sql
,备份成其他格式的文件也是可以的。例如,后缀名为.txt
的文件。通常情况下,建议备份成后缀名为.sql
的文件。因为,后缀名为.sql
的文件给人第一感觉就是与数据库有关的文件。
例 1
下面使用 root 用户备份 test 数据库下的 student 表。打开命令行(cmd)窗口,输入备份命令和密码,运行过程如下:
C:\Windows\system32>mysqldump -uroot -p test student>C:\student.sql
Enter password: ****
对某个整个数据库进行备份举例:
C:\Users\Administrator>mysqldump -u root -p sd > E:\cqsfdx\mysql\backup\sd.sql
Enter password: ******
备份多个数据库
如果要使用 mysqldump 命令备份多个数据库,需要使用 --databases 参数。备份多个数据库的语法格式如下:
mysqldump -u username -P --databases dbname1 dbname2 ... > filename.sql
加上“--databases”参数后,必须指定至少一个数据库名称,多个数据库名称之间用空格隔开。
例 2
下面使用 root 用户备份 test 数据库和 mysql 数据库。命令如下:
mysqldump -u root -p --databases test mysql>C:\testandmysql.sql
执行完后,可以在C:\
下面看到名为 testandmysql.sql 的文件,这个文件中存储着这两个数据库的信息。
备份所有数据库
mysqldump 命令备份所有数据库的语法格式如下:
mysqldump -u username -P --all-databases>filename.sql
使用“--all-databases”参数时,不需要指定数据库名称。
例 3
下面使用 root 用户备份所有数据库。命令如下:
mysqldump -u root -p --all-databases > C:\all.sql
执行完后,可以在 C:\
下面看到名为 all.sql 的文件,这个文件中存储着所有数据库的信息。
MySQL恢复数据库(mysql命令)
当数据丢失或意外损坏时,可以通过恢复已经备份的数据来尽量减少数据的丢失和破坏造成的损失。本节主要介绍如何对备份的数据进行恢复操作。
在 MySQL 中,可以使用 mysql 命令来恢复备份的数据。mysql 命令可以执行备份文件中的 CREATE 语句和 INSERT 语句,也就是说,mysql 命令可以通过 CREATE 语句来创建数据库和表,通过 INSERT 语句来插入备份的数据。
mysql 命令语法格式如下:
mysql -u username -p [dbname] < filename.sql
其中:
- username 表示用户名称;
- dbname 表示数据库名称,该参数是可选参数。如果 filename.sql 文件为 mysqldump 命令创建的包含创建数据库语句的文件,则执行时不需要指定数据库名。如果指定的数据库名不存在将会报错;
- filename.sql 表示备份文件的名称。
注意:mysql 命令和 mysqldump 命令一样,都直接在命令行(cmd)窗口下执行。
例 1
下面使用 root 用户恢复所有数据库,命令如下:
mysql -u root -p < C:\all.sql
执行完后,MySQL 数据库就已经恢复了 all.sql 文件中的所有数据库。
注意:如果使用--all-databases
参数备份了所有的数据库,那么恢复时不需要指定数据库。因为,其对应的 sql 文件中含有 CREATE DATABASE 语句,可以通过该语句创建数据库。创建数据库之后,可以执行 sql 文件中的 USE 语句选择数据库,然后在数据库中创建表并且插入记录。
定时备份
这里我选择crontab来进行定时备份,可以参考:http://c.biancheng.net/view/1092.html
crontab -e
#进入 crontab 编辑界面。会打开Vim编辑你的任务
* * * * * 执行的任务
这个文件中是通过 5 个“*”来确定命令或任务的执行时间的,这 5 个“*”的具体含义如表 2 所示。
这个文件中是通过 5 个“*”来确定命令或任务的执行时间的,这 5 个“*”的具体含义如表 2 所示。
项目 | 含义 | 范围 |
---|---|---|
第一个"*" | 一小时当中的第几分钟(minute) | 0~59 |
第二个"*" | 一天当中的第几小时(hour) | 0~23 |
第三个"*" | 一个月当中的第几天(day) | 1~31 |
第四个"*" | 一年当中的第几个月(month) | 1~12 |
第五个"*" | 一周当中的星期几(week) | 0~7(0和7都代表星期日) |
在时间表示中,还有一些特殊符号需要学习,如表 3 所示。
特殊符号 | 含义 |
---|---|
*(星号) | 代表任何时间。比如第一个"*"就代表一小时种每分钟都执行一次的意思。 |
,(逗号) | 代表不连续的时间。比如"0 8,12,16***命令"就代表在每天的 8 点 0 分、12 点 0 分、16 点 0 分都执行一次命令。 |
-(中杠) | 代表连续的时间范围。比如"0 5 ** 1-6命令",代表在周一到周六的凌晨 5 点 0 分执行命令。 |
/(正斜线) | 代表每隔多久执行一次。比如"*/10****命令",代表每隔 10 分钟就执行一次命令。 |
当“crontab -e”编辑完成之后,一旦保存退出,那么这个定时任务实际就会写入 /var/spool/cron/ 目录中,每个用户的定时任务用自己的用户名进行区分。而且 crontab 命令只要保存就会生效,只要 crond 服务是启动的。知道了这 5 个时间字段的含义,我们多举几个时间的例子来熟悉一下时间字段,如表 4 所示。
时间 | 含义 |
---|---|
45 22 ***命令 | 在 22 点 45 分执行命令 |
0 17 ** 1命令 | 在每周一的 17 点 0 分执行命令 |
0 5 1,15**命令 | 在每月 1 日和 15 日的凌晨 5 点 0 分执行命令 |
40 4 ** 1-5命令 | 在每周一到周五的凌晨 4 点 40 分执行命令 |
*/10 4 ***命令 | 在每天的凌晨 4 点,每隔 10 分钟执行一次命令 |
0 0 1,15 * 1命令 | 在每月 1 日和 15 日,每周一个 0 点 0 分都会执行命令,注意:星期几和几日最好不要同时出现,因为它们定义的都是天,非常容易让管理员混淆 |
现在我们已经对这 5 个时间字段非常熟悉了,可是在“执行的任务”字段中都可以写什么呢?既可以定时执行系统命令,也可以定时执行某个 Shell 脚本,这里举几个实际的例子。
【例 1】让系统每隔 5 分钟就向 /tmp/test 文件中写入一行“11”,验证一下系统定时任务是否会执行。
[root@localhost ~]# crontab -e #进入编辑界面 */5 * * * * /bin/echo "11" >> /tmp/test
这个任务在时间工作中没有任何意义,但是可以很简单地验证我们的定时任务是否可以正常执行。如果觉得每隔 5 分钟太长,那就换成“*”,让它每分钟执行一次。而且和 at 命令一样,如果我们定时执行的是系统命令,那么最好使用绝对路径。
【例 2】让系统在每周二的凌晨 5 点 05 分重启一次。
[root@localhost ~]# crontab -e 5.5 * * 2 /sbin/shutdown -r now
如果服务器的负载压力比较大,则建议每周重启一次,让系统状态归零。比如绝大多数游戏服务器每周维护一次,维护时最主要的工作就是重启,让系统状态归零。这时可以让我们的服务器自动来定时执行。
【例 3】在每月 1 日、10 日、15 日的凌晨 3 点 30 分都定时执行日志备份脚本 autobak.sh。
[root@localhost ~]# crontab -e 30.3 1,10,15 * * /root/sh/autobak.sh
这些定时任务保存之后,就可以在指定的时间执行了。我们可以使用命令来查看和删除定时任务,命令如下:
[root@localhost ~]# crontab -l #查看root用户的crontab任务 */5 * * * * /bin/echo "11" >> /tmp/test 5.5 * * 2 /sbin/shutdown -r now 30.3 1,10,15 * * /root/sh/autobak.sh [root@localhost ~]# crontab -r #删除root用户所有的定时任务。如果只想删除某个定时任务,则可以执行“crontab -e”命令进入 #编辑模式手工删除 [root@localhost ~]# crontab -l no crontab for root #删除后,再查询就没有root用户的定时任务了
在书写 crontab 定时任务时,需要注意以下几个事项:
- 6 个选项都不能为空,必须填写。如果不确定,则使用“*”代表任意时间。
- crontab 定时任务的最小有效时间是分钟,最大有效时间是月。像 2018 年某时执行、3 点 30 分 30 秒这样的时间都不能被识别。
- 在定义时间时,日期和星期最好不要在一条定时任务中出现,因为它们都以天为单位,非常容易让管理员混淆。
- 在定时任务中,不管是直接写命令,还是在脚本中写命令,最好都使用绝对路径。有时使用相对路径的命令会报错。
自定义用例
创建一个sh脚本,让其在某个时间段一直输出:
vim /root/hello.sh 内容: #!/bin/bash echo "hello world!!" #该脚本会打印"hello world!!"
特别注意的地方:该sh脚本默认是不可以执行的,需要提升成可执行的权限:
chmod +x /root/hello.sh
然后设置crontab:
crontab -e #内容: * 17 * * * /root/hello.sh >> /root/hello.log #表示再每天17点开始,过一分钟就执行一次
最后观看效果:
[root@iza1g30t3retsbz ~]# tail -f hello.log hello world!! hello world!! hello world!! hello world!! hello world!! hello world!! hello world!! hello world!! hello world!! hello world!
自定义数据备份用例
创建一个数据库备份的sh脚本:
#!/bin/bash time1=$(date +"%Y%m%d%H%M") /usr/bin/mysqldump -uroot -po1*GzHO^HB%5lgIj sd > /backup/mysqldata/sd_data_"${time1}".sql time2=$(date +"%Y%m%d%H" -d "-24hour") /usr/bin/rm -rf /backup/mysqldata/sd_data_"${time2}"*.sql
提升权限:
chmod +x /backup/mysqldump.sh
测试执行一次,将正确或者错误信息写到相关日志文件中,重定向不清楚可以参考http://c.biancheng.net/view/942.html:
/backup/mysqldump.sh >> /backup/mysqldump.log 2>&1
编辑crontab:
crontab -e 追加内容: 0 * * * * /backup/mysqldump.sh >> /backup/mysqldump.log 2>&1 # 表示 每个小时备份一次。