一、数据卷准备

1.创建数据卷

docker volume create mysql_dbdata
docker volume ls # 查看
docker volume inspect mysql_dbdata

删除数据卷

$ docker rm -v <container_id> # 删除容器及关联
$ docker volume rm <volume_name> # 删除数据卷

2.创建数据卷容器

docker run -it -v mysql_dbdata:/var/lib/mysql/ --name mysql_dbdata ubuntu

默认-v 挂载的是匿名数据卷,可先创建数据卷指定名称,再挂载到宿主机本地目录。 ":"前为数据卷名称,后面为宿主机地址。(这点与数据卷挂载时不一致,数据卷挂载":"前面是宿主机本地地址,后面是容器内地址。)
默认执行权限是RW,若想设置只读需添加:ro
例如:

docker run -it -v mysql_dbdata:/var/lib/mysql/:ro --name mysql_dbdata ubuntu

3.创建容器来挂载mysql_dbdata的数据。

docker run -it --volumes-from mysql_dbdata --name db1 ubuntu
docker run -it --volumes-from mysql_dbdata --name db2 ubuntu

db1和db2 都挂载同一个数据卷到相同的/var/lib/mysql/ 目录。三个容器任何一方在该目录下的写入,其他容器都可以看到。

二、容器启动

1.启动mysql容器并挂载数据卷容器

docker run -d -p 23333:3306 --name db_mysql_1 -v $(PWD)/my.cnf:/etc/mysql/my.cnf  --volumes-from db1 -e MYSQL_USER="lfc" -e MYSQL_ROOT_PASSWORD=123456 mysql/mysql-server

2.宿主机查看容器日志

#实时查看docker容器日志
$ sudo docker logs -f -t --tail 行数 容器名
#例:实时查看docker容器名为s12的最后10行日志
$ sudo docker logs -f -t --tail 10 s12

三、数据迁移备份

1.备份数据

(–volumes-from mysql_dbdata)新建容器挂载该容器卷
(-v $(pwd):/backup)并且将宿主机当前目录挂载到新容器backup下。
(tar cvf /backup/backup.tar /var/lib/mysql)将容器数据卷内数据打包至backup下。

docker run --name backup_copy --volumes-from mysql_dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /var/lib/mysql

2.数据恢复

新建数据卷容器

docker run -v /var/lib/mysql --name mysql_dbdata2 ubuntu /bin/bash

另创建一个容器挂载mysql_dbdata2 的容器并使用untar将备份文件解压到挂载的容器卷中。

docker run --name copydata --volumes-from mysql_dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar

四、加载新实例

1.新建实例加载mysql_dbdata2数据卷容器

docker run -d -p 24444:3306 --name db_mysql_1 -v $(PWD)/my.cnf:/etc/mysql/my.cnf  --volumes-from mysql_dbdata2 -e MYSQL_USER="lfc" -e MYSQL_ROOT_PASSWORD=123456 mysql/mysql-server

五、Mysql使用

1.基本操作

操作

SQL

查询所有数据库

show databases;

查看活跃连接

show processlist;

创建数据库

create database blog default character set utf8;

查看数据库的默认字符集

show create database blog;

删除数据库

drop database blog;

修改数据库

alter database blog default character set gbk;

选择数据库

use blog;

看所有表

show tables;

创建表

create table student(sid int,sname varchar(20));

查看表结构

desc student;

删除表

drop table student;

添加字段

alter table student add sgender varchar(2);

删除字段

alter table student drop sgender;

修改字段类型

alter table student modify sgender varchar(100);

修改字段名称

alter table student change sgender gender varchar(2);

修改表名称

alter table student rename to teacher;

2.问题汇总

1.ERROR 1130

ERROR 1130: Host '192.168.1.3' is not allowed to connect to this

mysql不允许远程登录,需使用命令行对其进行设置,具体方法有两种,授权法和改表法。

1.使用root权限登录
mysql -u root -p
2.改表法

使用localhost的主机登录,登入后更改mysql数据库中user表里的host项,“localhost"更改成”%"。% 号为所有,也可改成某固定IP。
命令

use mysql;
update user set host = '%' where user = 'root';
select host, user from user;
3.授权法
ALTER USER 'lfc'@'%' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER; 
ALTER USER 'lfc'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

mysql8.0之后进行了修改,授权和创建用户是分开设置的。

create user 'lfc'@'%' identified by '123456';
grant ALL PRIVILEGES on *.* TO 'lfc'@'%' ; # 前面的*是指定数据库,后面的*指定的是表。

创建账户:create user ‘用户名’@‘访问主机’ identified by ‘密码’;
赋予权限:grant 权限列表 on 数据库 to ‘用户名’@‘访问主机’ ;(修改权限时在后面加with grant option)

2.Error Code: 1044.

Error Code: 1044. Access denied for user 'root'@'%' to database

授权的权限没有打开: Grant_priv is set to N for root@%. 修复下

UPDATE user SET Grant_priv='Y', Super_priv='Y' WHERE User='lfc';
FLUSH PRIVILEGES; #刷新

MySQL 常见数据类型
在 MySQL 中常见的数据类型如下:

  1. 整数类型 包括 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,浮点数类型 FLOAT 和
    DOUBLE,定点数类型 DECIMAL。 2) 日期/时间类型 包括 YEAR、TIME、DATE、DATETIME 和
    TIMESTAMP。 3) 字符串类型 包括 CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM 和
    SET 等。 4) 二进制类型 包括 BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB 和
    LONGBLOB。
时区问题
select now(); #查看mysql系统时间。和当前时间做对比
set global time_zone = '+8:00'; #设置时区更改为东八区
flush privileges;  #刷新权限

然后退出后重新登录就可以了.