centos7 docker 安装 mysql5.7.24 导入12G的sql

先在CentOS7里面安装docker

Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。通过 uname -r 命令查看你当前的内核版本

uname -r

3.10.0-514.el7.x86_64

1、初步安装和启动docker
yum update -y
yum -y install docker
systemctl start docker


2、设置镜像
vi /etc/docker/daemon.json

{
"registry-mirrors": ["https://aj2rgad5.mirror.aliyuncs.com"]
}

加速器地址可以在阿里云找到


3、开放管理端口映射
vi /lib/systemd/system/docker.service

将第11行的ExecStart=/usr/bin/dockerd,替换为:

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock -H tcp://0.0.0.0:7654

2375是管理端口,7654是备用端口

在~/.bashrc中写入docker管理端口

export DOCKER_HOST=tcp://0.0.0.0:2375

source ~/.bashrc


4、重启docker
systemctl daemon-reload
systemctl restart docker.service


5、测试docker是否正常安装和运行
docker run hello-world

6、查看结果
Hello from Docker!
This message shows that your installation appears to be working correctly.

安装好docker后安装mysql

安装
1、拉取镜像(这里使用5.7.24版本)

docker pull mysql:5.7.24

2、启动

# 创建了一个名为mysql5_7_24的MySQL数据库服务器容器实例
docker run --name mysql5_7_24 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.24


命令说明:

-p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口
-e MYSQL_ROOT_PASSWORD=root:初始化 root 用户的密码
其他命令
访问容器
docker exec -it mysql5_7_24 bash

进入容器内部,我们就可以登录到mysql了

[root@localhost ~]# docker exec -it mysql5_7_24 bash
root@95a0cd6077a0:/# ls
bin boot dev docker-entrypoint-initdb.d entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@95a0cd6077a0:/# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 7
Server version: 5.7.24 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| novadb |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)

mysql>


查看日志
docker logs -f mysql5_7_24

进入终端
docker exec -it mysql5_7_24 mysql -uroot -proot

使用自定义MySQL配置文件
默认情况下,MySQL的启动配置文件是/etc/mysql/my.cnf,而/etc/mysql/conf.d目录下的存在任何.cnf格式的文件时,都会使用该文件中配置项替换默认配置。
因此,如果要使用自定义配置,可以在宿主机创建一个配置文件,然后在创建容器时通过-v参数,以数据卷的方式将自定义配置挂载到mysql容器的/etc/mysql/conf.d目录下。

例:

docker run --name mysql5_7_24 -p 3306:3306 -v /usr/local/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.24

以上示例会启动一个名为mysql5_7_24的MySQL服务器容器,该文件启动时会同时使用/usr/local/mysql/conf/my.cnf中的配置

注:如果使用到mysql主从配置,那么在mysql 5.7版本中不要使用挂载配置文件的方式,可以采用宿主机拷贝替换容器中的/etc/mysql/my.cnf文件,因为博主发现挂载配置文件开启log-bin没有生效,在这块遇到了坑,如果谁有更好的方法可以给博主留言

数据存储
在使用mysql镜像创建MySQL容器时,数据库数据存储可能会有以下两种方式:
1).数据卷容器:使用Docker默认的数据管理方式来管理数据库的数据存储,在这种方式下,数据库文件会被写入数据库的内部。这种方式对于用户非常简单,缺点是很在宿主机上找到所存储的数据。

2).外部数据卷:在宿主机创建一个数据目录,再将数据目录挂载到容器内部。这种方式可以很方便的在宿主机上找到并进行数据管理,但需要确保数据目录的存在。

当使用外部数据卷时,例:

docker run --name mysql5_7_24 -p 3306:3306 -v /usr/local/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.24

表示将宿主机的/usr/local/mysql/data目录挂载到容器内的/var/lib/mysql目录

日志存储
同理,我们也可以将日志挂载到宿主机上,例:

docker run --name mysql5_7_24 -p 3306:3306 -v /usr/local/mysql/log:/var/log/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.24

表示将宿主机的/usr/local/mysql/log目录挂载到容器内的/var/log/mysql目录

那么总结起来同时挂载配置、数据卷、日志的命令为:

docker run --name mysql5_7_24 -p 3306:3306 -v /usr/local/mysql/conf:/etc/mysql/conf.d -v /usr/local/mysql/log:/var/log/mysql -v /usr/local/mysql/data:/var/lib/mysql --privileged=true -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.24

我安装的时候直接指定的my.cnf配置文件也是可以的如下

docker run --name mysql5_7_24 -p 3306:3306 -v /usr/local/mysql/conf/my.cnf:/etc/mysql/my.cnf -v /usr/local/mysql/log:/var/log/mysql -v /usr/local/mysql/data:/var/lib/mysql --privileged=true -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.24

其中的 -- privileged=true

是我启动mysql的时候发现mysql启动不了,通过 docker logs命令查看,发现提示信息是:chown: changing ownership of ‘/var/lib/mysql/....‘: Permission denied

于是,解决方法有这么三个:

  1. 在docker run中加入 --privileged=true  给容器加上特定权限
  2. 关闭selinux
  3. 在selinux添加规则,修改挂载目录的权限

下面开始导入nova.sql,这个文件一共12G

有时候会发现虽然很小的sql文件,在source导入数据库的时候也会很慢。这时候我们可以来修改一些mysql的数据库的配置来加快source导入的速度。

编辑/usr/local/mysql/conf/my.cnf加入如下内容

[mysqld]
interactive_timeout = 120
wait_timeout = 120
max_allowed_packet = 32M

1.查看变量 innodb_flush_log_at_trx_commit的值

SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit' ;
2.查询结果如果是1的话,将其修改成0

SET GLOBAL innodb_flush_log_at_trx_commit =0;
3.这时候再source,会发现速度快了很多,在结束后记得把这个变量重新设置成1

SET GLOBAL innodb_flush_log_at_trx_commit =1;

通过docker stop 和docker start来重启mysql的容器使得配置生效

想要更快的提高source导入的速度需要在执行mysqldump的时候加 -e 参数使得生成的sql脚步是批量入库方式

source导入速度慢的解决办法:

假设要讲A数据库的数据导入到B数据库

1、首先确定目标库(B)的参数值,登录数据库B,执行以下命令

mysql>show variables like 'max_allowed_packet';
mysql>show variables like 'net_buffer_length';

2、根据参数值,在A数据库中使用mysqldump命令,如:

C:Windowssystem32>mysqldump -uroot -p idsource -e --max_allowed_packet=1048576 --net_buffer_length=16384 >C: ova_work_document ovaold_mysqldb_backupidsource20190212.sql

-e 使用包括几个VALUES列表的多行INSERT语法;
--max_allowed_packet=XXX 客户端/服务器之间通信的缓存区的最大大小;
--net_buffer_length=XXX  TCP/IP和套接字通信缓冲区大小,创建长度达net_buffer_length的行。

注意:max_allowed_packet和net_buffer_length不能比目标数据库的设定数值 大,否则可能出错。

3、登录数据库B,执行source命令导入

 use idsource;

source C: ova_work_document ovaold_mysqldb_backupidsource20190212.sql

一、主机与docker容器之间数据导入、导出

从主机复制到容器

sudo docker cp host_path containerID:container_path
从容器复制到主机

sudo docker cp containerID:container_path host_path
二、mysql source导入*.sql文件

进入数据库容器

docker exec -it containerID bash
数据库导入

mysql -h localhost -u root -p(进入mysql下面)
create database abc;(创建数据库)
show databases;(就可看到所有已经存在的数据库,以及刚刚创建的数据库abc)
use abc;(进入abc数据库下面)
show tables;(产看abc数据库下面的所有表,空的)
source /root/test.sql(导入数据库表)
show tables;(查看abc数据库下面的所有表,就可以看到表了)
desc pollution;(查看表结构设计)
select * from pollution;
exit(或者ctrl + c)退出mysql

比如执行 docker cp /root/nova.sql 95a0cd6077a0:/opt/

把文件拷贝到容器后在mysql中执行

use novadb;(进入abc数据库下面)
show tables;(产看abc数据库下面的所有表,空的)
source /opt/nova.sql(导入数据库表)

原文地址:https://www.cnblogs.com/xiaohanlin/p/10012730.html