安装docker的mysql, 由于笔者的阿里云的mysql5.6,percona-xtrabackup必须是2.3.10
首先安装一个docker的mysql, 用下面的命令,必须跟阿里云的mysql版本一致,使用select version(); 可以查看mysql版本号 ,笔者阿里云的mysql是是5.6.16-log,所以装的是mysql:5.6
docker run -v "E:\tmp\mnt:/data" --name docker-mysql -e MYSQL_ROOT_PASSWORD=123456 -p 13306:3306 -d mysql:5.6
其中 -v表示挂载目录 ,把本机的E:\tmp\mnt 挂载到 docker的/data目录,这样才能从主机复制文件到docker ,千万不能省,--name docker-mysql 表示docker的容器名称叫做docker-mysql ,可以随便取。 -d mysql:5.6 表示取得是mysql5.6版本镜像。
可以参考官方文档 https://hub.docker.com/_/mysql/
然后进入mysql的docker内:
docker exec -it docker-mysql bash
mysql 的linux版本是
root@8c99cbc8dd6f:/# cat /etc/issue
Debian GNU/Linux 9 \n \l
表示 Debian 9(stretch) — 旧的稳定版(oldstable)
参考文档:
https://www.debian.org/releases/
为了下载软件,更新debian的镜像,这个版本是stretch
/etc/apt/sources.list ,添加下面的东西
deb http://mirrors.aliyun.com/debian/ stretch main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ stretch main non-free contrib
deb http://mirrors.aliyun.com/debian-security stretch/updates main
deb-src http://mirrors.aliyun.com/debian-security stretch/updates main
deb http://mirrors.aliyun.com/debian/ stretch-updates main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ stretch-updates main non-free contrib
deb http://mirrors.aliyun.com/debian/ stretch-backports main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ stretch-backports main non-free contrib
参考文档:
https://www.cnblogs.com/horizonli/p/5179224.html
注意mysql装的debian什么都没有,要用主机的上的编辑器修改改之后 ,通过挂载的目录拷进去
然后 apt-get update 更新应用修改
然后下载安装percona-xtrabackup ,这个是阿里云的mysql使用的热备份工具
拷风到刚才挂载的目录上,2.3.10版本下载地址:https://www.percona.com/downloads/Percona-XtraBackup-2.3/Percona-XtraBackup-2.3.10/binary/debian/stretch/x86_64/percona-xtrabackup_2.3.10-1.stretch_amd64.deb
输入命令安装,注意有其他文件,只要下载像这样的文件就行了,有不同版本,像percona-xtrabackup-dbg_2.3.10-1.stretch_amd64.deb表示调试版本,不用下载
dpkg -i percona-xtrabackup_2.3.10-1.stretch_amd64.deb
会报错依赖丢失,怎么办输入:
apt-get -f -y install
意思就是假如你的系统上有某个package不满足依赖条件,这个命令就会自动修复,安装那个package依赖的package。
然后再输入dpkg -i percona-xtrabackup_2.3.10-1.stretch_amd64.deb
然后:
apt-get update
apt-get install percona-xtrabackup
安装参考资料
https://www.percona.com/doc/percona-xtrabackup/2.3/installation/apt_repo.html
xtrabackup 参考资料:
https://www.percona.com/downloads/Percona-XtraBackup-2.3/LATEST/
可能会遇到问题,百度一下就行了
然后使用xtrabackup来还原数据,把阿里云下载的备份文件拷到挂载的目录上
笔者是hins9364501_data_20190923104325_qp.xb ,把他解压到/home/mysql/data,使用命令如下:
## 创建目录:
mkdir -p /home/mysql/data
## 解包
cat hins9364501_data_20190923104325_qp.xb | xbstream -x -v -C /home/mysql/data
## 解压
innobackupex --decompress --remove-original /home/mysql/data
结果报sh: 1: qpress: not found
cat: write error: Broken pipe
Error: decrypt and decompress thread 0 failed.
解决办法:
把http://www.quicklz.com/qpress-11-linux-x64.tar 下载下来,
tar xvf qpress-11-linux-x64.tar
cp qpress /usr/bin
再执行innobackupex --decompress --remove-original /home/mysql/data
成功
执行如下命令,恢复解压好的备份文件。
innobackupex --defaults-file=/home/mysql/data/backup-my.cnf --apply-log /home/mysql/data
把执行如下命令,修改文件属主,并确定文件所属为MySQL用户
chown -R mysql:mysql /home/mysql/data
最后把 /home/mysql/data 挂载到docker的mysql时差去,
编辑/etc/mysql/mysql.conf.d/mysqld.cnf ,替换mysql 目录
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
#datadir = /var/lib/mysql
datadir = /home/mysql/data
#log-error = /var/log/mysql/error.log
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
我是使用外面编辑好,再拷过去
cp /data/mysqld.cnf /etc/mysql/mysql.conf.d/
重启docker 试试看,用navicat连接上看看,用阿里云上的用户登录 果然好了。
但是还有一个问题,不能用root登录 ,/etc/mysql/mysql.conf.d/mysqld.cnf加上
skip-grant-tables,这样就能使用root ,没有密码登录了
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
#datadir = /var/lib/mysql
datadir = /home/mysql/data
#log-error = /var/log/mysql/error.log
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
skip-grant-tables
用navicat登录之后 ,修改root用户密码,结果发现还是不能用localhost登录 ,怎么办,
update user set password=password('123456') where user='root';
flush privileges;
查询select * from user where user='root';
发现没有localhost,把127.0.0.1复制出来,改成localhost插入就行了
INSERT INTO `mysql`.`user`(`Host`, `User`, `Password`, `Select_priv`, `Insert_priv`, `Update_priv`, `Delete_priv`, `Create_priv`, `Drop_priv`, `Reload_priv`, `Shutdown_priv`, `Process_priv`, `File_priv`, `Grant_priv`, `References_priv`, `Index_priv`, `Alter_priv`, `Show_db_priv`, `Super_priv`, `Create_tmp_table_priv`, `Lock_tables_priv`, `Execute_priv`, `Repl_slave_priv`, `Repl_client_priv`, `Create_view_priv`, `Show_view_priv`, `Create_routine_priv`, `Alter_routine_priv`, `Create_user_priv`, `Event_priv`, `Trigger_priv`, `Create_tablespace_priv`, `ssl_type`, `ssl_cipher`, `x509_issuer`, `x509_subject`, `max_questions`, `max_updates`, `max_connections`, `max_user_connections`, `plugin`, `authentication_string`, `password_expired`) VALUES ('localhost', 'root', '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', '', '', '', '', 0, 0, 0, 0, '', '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9', 'N');
结果是:
就可以在localhost上使用root登录了
最后注意的是默认的mysql的配置文件是:/etc/mysql/mysql.conf.d/mysqld.cnf 如果要修改,修改之后 ,如果重启失败,可以把可以用的mysqld.cnf拷进去,再重启试试,命令如下:其中d17d5768b241的容器名。
docker cp .\mysqld.cnf d17d5768b241:/etc/mysql/mysql.conf.d/
阿里云上相关参考资料: