新手程序员入职学习:小任务(2)

131 阅读4分钟

Centos虚机使用docker安装mysql,并实现自动备份

这次安排的学习任务分为了6个小任务:

  • 安装centos,版本7.6,最小化安装
  • 安装docker
  • 通过docker安装mysql,并连接windows
  • 实现自动备份数据库
  • 写一个数据库读写的程序,代码打包到docker部署在虚拟机上
  • 拓展虚机的硬盘,把新增的硬盘挂载到根目录

前3个任务在上一篇文章中介绍了完成过程,这篇文章记录后3个任务的完成

实现数据库自动备份

数据库的自动备份可以使用linux系统中的shell脚本

编写备份脚本

创建脚本vi backup.sh 添加内容

BACKUP_ROOT=/usr/data
BACKUP_FILEDIR=$BACKUP_ROOT/mysql_bak 
DATE=$(date +%Y%m%d)
DATABASES=$(docker exec -i mysql01 mysql -uroot -p123456 -e "show databases"|grep -Ev "database|sys|information_schema|performance_schema|mysql")

for db in $DATABASES
do
docker exec -i mysql01 mysqldump -uroot -p123456 --default-character-set=utf8 -q --lock-all-tables --flush-logs -E -R --triggers -B ${db} | gzip > $BACKUP_FILEDIR/${db}_$DATE.sql.gz

echo ${db}
done

echo "done"

这是我第一次接触shell脚本,shell脚本中存放的代码是一串指令,系统使用自带的命令解释器:sh bash就可以执行。 docker exec -i mysql01 mysqldump -uroot -p123456 --default-character-set=utf8 -q --lock-all-tables --flush-logs -E -R --triggers -B ${db} | gzip> $BACKUP_FILEDIR/${db}_$DATE.sql.gz是脚本的核心语句,是执行数据库备份的命令

grep命令用来查找文件里符合条件的字符串
| 管道符意为将前一个命令的输出作为后一个命令的输入
-v 参数表示排除关键字的信息
-E 表示用分隔符|分隔关键字,添加参数-E可以使用正则表达式,如果不使用正则,不添加-E也可以

mysqldump是mysql自带的备份脚本程序,其中封装了create,insert等一系列数据库命令。
--default-character-set 指定导出时的字符集
-q quick快速取出,读取时不记录数据存入内存而是直接将数据输出入文件
--lock-all-tables 备份时锁定所有数据表
--flush-logs/-F 逐个数据库刷新日志
--extended-insert, -e 使用包含多个值得多行语法生成INSERT语句。这会缩小dump文件体 积,并且在加快dump文件的insert操作
-R -routines 导出存储过程和函数
--triggers 导出触发器(默认导出)
-B –databases 导出数据库列表,单个库时可省略

gzip 压缩文件命令 其中 > 重定向命令符,用来指定存储目标

echo 相当于print

运行命令sh backup.sh就可以直接进行备份了

实现自动备份

要完成自动备份,还需要使用crond服务(周期任务)用来定期执行程序,使用方法可以参考:www.runoob.com/linux/linux…

命令crontab -e添加周期任务 0 0 * * * /usr/data/backup.sh > /usr/data/logs/backup.log 2>&1 前五个数字代表分,时,一月中的第几天,月 以及一周中的第几天,* 代表该位数字取任意,即每天/月都要执行。,
命令crontab -l表示列出所有时间表

编写数据库读取程序,并打包到docker进行部署

编写数据库读写程序

编写数据库读取程序主要时,需要使用到pymysql库。调用pymysql库后,首先创建连接的实例对象,然后调用连接对象的cursor方法创建游标,接下来的操作主要就对着游标进行


if __name__ == '__main__':
    mysql_para = {
        'host':'192.168.85.188',
        'user':'root',
        'password':'123456',
        'db':'testsql',
        'charset':'utf8',
    }
    connect_testsql = pymysql.connect(**mysql_para)
    cursor_testsql = connect_testsql.cursor()

创建完游标,只需要将要执行的数据库语句作为参数,执行cursor.execute()就可以执行了

    option = input('请选择要执行的命令:1.写 2.读\n')
    if option == '2':
        command = 'select * from %s;'%table_name
        cursor_testsql.execute(command)
        data = cursor_testsql.fetchall()
        print(data)
    elif option == '1':
        date = input('请输入date:\n')
        content = input('请输入content:\n')
        command = 'insert into %s (date,content) values (%s,%s);'%(table_name,date,content)
        cursor_testsql.execute(command)
        print('完成插入')
    else:
        print('输入错误,请输入数字1~2')

fetchall方法获取抓取到的数据
完成后将数据保存并提交

connect_testsql.commit()
connect_testsql.close()

然后将写好的py文件使用docker打包。在这过程中首先遇到了一个问题,我是在windows主机上编写的py程序,但是docker在虚拟机上,需要将程序首先从主机上传输到虚拟机上。

虚拟机主机文件传输的方法

目前我知道的有三种方法可以实现宿主机到虚拟机的文件传输

  1. 创建共享文件夹
  2. scp命令
  3. xshell与xftp

创建共享文件夹

创建共享文件夹的教程参考:blog.csdn.net/qq122453418…www.cnblogs.com/tianbusheng…

scp命令

scp命令的使用参考:www.runoob.com/linux/linux…

直接在cmd上输入 scp -r D:\vscode\transport root@192.168.85.188:/usr/data
就可以将transport文件夹传入data文件夹,-r命令递归复制整个目录。

xftp

xftp非常方便,参考t.zoukankan.com/lidelin-p-6…

程序用docker打包部署

参考:blog.csdn.net/songlh1234/…

拓展虚机硬盘,并挂载在根目录下

参考:blog.csdn.net/u012637358/…