“知了”开发日志——数据备份

1. 备份命令

  • 数据库数据备份

    1
    scp -r root@192.168.35.142:/usr/local/mysql/mysqldb/knowledge_ms [local_path]
  • web文件数据备份

    1
    scp -r root@192.168.35.127:/opt/store [local_path]

以上备份操作基于scp命令实现,可以直接在某人的电脑上手动实现一次备份;也可以直接在其他机器通过shell脚本定时备份。

mac与linux可以直接使用scp命令;

windows上可能无法使用scp命令(需要手动前往安装ssh工具https://sourceforge.net/projects/sshwindows/files/

2. MySQL数据回滚

由于我们备份的是mysqldata对应表目录下的ibd文件,回滚操作可以参考以下博客:

(在8之前InnoDB存储表的结构和数据时,分别存储在frm文件和ibd文件,因此在不知道表结构的情况下还需要备份.frm文件。而在8的时候全都存到了ibd文件里。)

知了的mysql版本:

1
2
[root@localhost mysqldb]# mysql -V
mysql Ver 8.0.18 for linux-glibc2.12 on x86_64 (MySQL Community Server - GPL)

原理:

  1. frm文件用于存储表结构,可以通过mysqlfrm工具从中提取出建表语句;mysql 8以后的版本通过ibd2sdi工具从ibd文件提取表结构;
  2. 使用建表语句重新建表;
  3. 建表后删除表空间;
  4. 将ibd文件替换到对应文件夹内;
  5. 修改ibd文件权限;
  6. 重新链接表空间。

备注:尝试了一下,使用idb获取表结构再建表过于繁琐,建议使用mysqldump配合-d选项,单独导出表结构的sql文件(导出带有数据的sql文件过大,不如使用ibd文件备份数据)。

3. 撰写定时备份脚本

知了的备份脚本已经加入附件可供参考!

可以撰写定时任务脚本实现定时备份,但scp命令需要输入密码,可以参照如下示例实现

示例:

1
sudo apt-get update 

第一种方法(scp命令不可行):

1
2
#!/bin/bash
echo [password] | sudo -S apt-get update

使用管道(上一个命令的 stdout 接到下一个命令的 stdin)

第二种方法(scp命令不可行):

1
2
3
4
\#!/bin/bash
sudo -S apt-get update << EOF
[password]
EOF

使用文本块输入重定向(说明:在shell脚本中,通常将EOF与 << 结合使用,表示后续的输入作为子命令或子Shell的输入,直到遇到EOF为止,再返回到主Shell,即将‘你的密码’当做命令的输入)

第三种方法:

expect(上面介绍的两种方法前提条件是指令有参数来设定密码输入方式,像ssh指令就没有这样的参数,第三种交互方式就派上用场了)

expect 需要额外安装

1
yum install expect

使用示例如下

1
2
3
4
5
6
\#!/bin/expect
set timeout 30
spawn ssh -l jikuan.zjk 10.125.25.189
expect "password:"
send "zjk123 "
interact

expect “password:”这句意思是交互获取是否返回 password: 作为关键字,因为在执行ssh时会返回输入password的提示:

1
xxxxxx@192.168.xx.xxx's password:

send就是将密码zjk123发送过去

------ 本文结束,感谢观看! ------
 wechat
扫一扫,访问本站