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在虚拟机上,需要将程序首先从主机上传输到虚拟机上。
虚拟机主机文件传输的方法
目前我知道的有三种方法可以实现宿主机到虚拟机的文件传输
- 创建共享文件夹
- scp命令
- 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…