1. 说明
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型和大型网站的开发都选择 MySQL 作为网站数据库。
2. 版本信息
Version: mysql:8.0.30
自定义版本信息
序 | 应用位置 | 服务名称 | 版本信息 | 备注 | 字符集 | 排序规则 |
---|---|---|---|---|---|---|
1 | 中心 | MySQL7056 | mysql:8.0.30 |
Master |
utf8mb4 -- UTF-8 Unicode |
utf8mb4_unicode_ci |
2 | 站点 | MySQL7055 | mysql:5.7.38 |
Slave |
utf8mb4 -- UTF-8 Unicode |
utf8mb4_general_ci |
3 | 中心 | mycat | mycat1.6.5 |
- | - | - |
自定义字符集及排序规则
字符集
utf8mb4 -- UTF-8 Unicode
utf8
- 最大字符长度为3字节,如果遇到4字节的字符就会出现错误了
- 无法存贮表情和不常用汉字
utf8mb4
- 最大字符长度为4字节
- 对于 CHAR 类型数据,存储会多消耗一些空间
- 多了表情的支持
排序规则
utf8mb4_unicode_ci
- 后缀
ci
:不区分大小写- 后缀
bin
:区分大小写general_ci
:不支持扩展,准确性相对于Unicode_ci
来说要低一点,速度快于Unicode_ci
unicode_ci
:支持扩展,准确性高于general_ci
,速度慢于general_ci
主从,数据持久化
Master
对外映射的端口号是3306
,Slave
对外映射的端口号是3306
,大家可以自己随意设置。因为docker容器是相互隔离的,每个容器有其独立的IP地址,所以不同容器使用相同的端口并不会冲突。如果是在生产环境,肯定是在不同的机器上安装MySQL,相对来说会简单一些
3. 参考资料
Docker Hub
MySQL docker hub
MySQL docker hub tags
其它资料
4. 准备工作
权限准备
管理员权限准备
[[0801 Docker#管理员权限准备]]
目录准备 7056
物理目录创建 7056
mkdir -p /volume1/{downloads/shared,programfiles,opt} && \
mkdir -p /volume1/docker/dockercompose/{mysql7056,}
持久化数据目录
rm -rf /volume1/docker/mysql/7056/{data,conf,initdb,logs,mysql-files,temp,} && \
mkdir -p /volume1/docker/mysql/7056/{data,conf,initdb,logs,mysql-files,temp,} && \
touch /volume1/docker/mysql/7056/conf/my.cnf && \
touch /volume1/docker/mysql/7056/initdb/initdb.sql && \
touch /volume1/docker/mysql/7056/logs/{mysql_error.log,mysql_slow_query.log,} && \
chmod 755 /volume1/docker/mysql/7056/{data,conf,initdb,logs,mysql-files,temp,} && \
chmod 644 /volume1/docker/mysql/7056/conf/my.cnf && \
chmod 777 /volume1/docker/mysql/7056/logs/{mysql_error.log,mysql_slow_query.log,} && \
ll /volume1/docker/mysql/7056 && \
ll /volume1/docker/mysql/7056/conf && \
ll /volume1/docker/mysql/7056/logs
写入自定义配置文件
也可以参考《利用原生配置》的方法[[0803 MySQL#容器临时目录复制至物理目录 备用]]
个人配置
cat >/volume1/docker/mysql/7056/conf/my.cnf<<'EOF'
# Version:8.0.30 (mysql-8.0.30-linux-glibc2.12-x86_64.tar.xz)
[client]
port = 3306
default-character-set = UTF8MB4
socket = /var/run/mysqld/mysqld.sock
[mysql]
port = 7056
default-character-set = UTF8MB4
[mysqld]
port = 7056
admin_port = 33562
mysqlx_port = 33560
user = mysql
server_id = 1
default-time_zone = '+8:00'
character-set-server = UTF8MB4
datadir = /var/lib/mysql
socket = /var/run/mysqld/mysqld.sock
log-error = /var/log/mysql_error.log
default-storage-engine = INNODB
innodb_data_home_dir = /var/lib/mysql
# default_authentication_plugin = mysql_native_password
authentication_policy = mysql_native_password
init_connect = 'SET NAMES UTF8MB4'
collation-server = UTF8MB4_UNICODE_CI
sql-mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO
slow_query_log = 1
slow_query_log_file = /var/log/mysql_slow_query.log
long_query_time = 5
bulk_insert_buffer_size = 120M
character-set-client-handshake = FALSE
max_connections = 200
max_connect_errors = 10
table_open_cache = 256
tmp_table_size = 32M
thread_cache_size = 9
read_rnd_buffer_size = 32M
sort_buffer_size = 32M
innodb_thread_concurrency = 16
join_buffer_size = 128M
innodb-autoextend-increment = 1000
explicit_defaults_for_timestamp = true
open_files_limit = 65535
innodb_buffer_pool_size = 1024M
# innodb_log_file_size = 2048M
# innodb_log_files_in_group = 3
innodb_redo_log_capacity = 2048M
innodb_log_buffer_size = 128M
innodb_file_per_table = 1
innodb_flush_log_at_trx_commit = 1
key_buffer_size = 64M
max_heap_table_size = 32M
# query_cache_type = 0
# query_cache_size = 0
# lower_case_table_names = 1
# query_cache_type,query_cache_size,lower_case_table_names,error
skip-name-resolve
# skip-grant-tables
# --skip-host-cache
host_cache_size=0
# mysqld --console --skip-grant-tables --shared-memory
[mysql_safe]
pid_file = /var/run/mysqld/mysql.pid
log-error = /var/log/mysql_error.log
[mysqldump]
quick
max_allowed_packet = 512M
EOF
cat /volume1/docker/mysql/7056/conf/my.cnf
常用配置
cat >/volume1/docker/mysql/7056/conf/my.cnf<<'EOF'
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
server_id = 2
character-set-server = UTF8MB4
collation-server = utf8mb4_general_ci
init_connect='SET NAMES UTF8MB4'
max_connections = 200
default_authentication_plugin = mysql_native_password
sql-mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO
[client]
default-character-set = UTF8MB4
[mysql]
default-character-set = UTF8MB4
[mysqldump]
default-character-set = UTF8MB4
EOF
cat /volume1/docker/mysql/7056/conf/my.cnf
写入自定义数据库(可省略)
数据库
newcat
首次自动执行文件
cat >/volume1/docker/mysql/7056/initdb/initdb.sql<<'EOF'
CREATE DATABASE IF NOT EXISTS newcat;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES;
EOF
cat /volume1/docker/mysql/7056/initdb/initdb.sql
tail /volume1/docker/mysql/7056/initdb/initdb.sql
容器临时目录复制至物理目录(可省略)(备用) 7056
容器临时创建
docker run -itd \
--name "mysql7056" \
-p 7056:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-h mysql_7056 \
mysql:8.0.30
容器临时目录copy至物理目录
拷贝容器内部的配置文件到宿主主机的目录
docker logs -f mysql7056
docker cp mysql7056:/etc/mysql/my.cnf /volume1/docker/mysql/7056/conf && \
cat /volume1/docker/mysql/7056/conf/my.cnf
docker container stop mysql7056 && docker rm mysql7056
docker cp mysql7056:/etc/mysql/my.cnf /volume1/sourcecode/nas/docker/mysql/7056/conf/my_default.cnf
cp -r /volume1/sourcecode/nas/docker/mysql/7056/conf/my_default.cnf /volume1/docker/mysql/7056/conf/my.cnf
映像准备
端口查询
netstat -atunlp | grep -iE 'LISTEN' | grep -iE '7056|3306'
# 7056物理机端口,3306容器端口
lsof -i:7056
kill -9 ID
容器本地查询
docker ps
docker ps -a
docker ps -aq
docker ps -a | grep mysql
docker ps | grep mysql
映像本地查询
docker images
docker images | grep mysql
docker images -a | grep mysql
docker images -aq
映像在线查询
docker search mysql
docker search --filter=stars=50 mysql
映像在线拉取
docker pull mysql:latest
docker pull mysql:8.0.30
5. 容器正式创建
Docker Container&docker cli
基于内网访问的部署
[[0801 Docker#bridge]]
基于外网访问的部署
docker run -itd \
--privileged=true \
--name "mysql7056" \
--restart=on-failure:3 -d \
-p 7056:7056 \
-e MYSQL_ROOT_PASSWORD=123456 \
--net=bridge \
--volume /volume1/docker/mysql/7056/data:/var/lib/mysql \
--volume /volume1/docker/mysql/7056/conf/my.cnf:/etc/mysql/my.cnf \
--volume /volume1/docker/mysql/7056/initdb/:/docker-entrypoint-initdb.d/ \
--volume /volume1/docker/mysql/7056/mysql-files:/var/lib/mysql-files \
--volume /volume1/docker/mysql/7056/logs:/var/log \
-v /etc/localtime:/etc/localtime \
-h mysql_7056 \
mysql:8.0.30
其它参数
-e PUID=0 \
-e PGID=0 \
--restart=always \
--restart unless-stopped \
--restart=on-failure:3 -d \
--net=host \
设置开机后自动重启容器
--volume /volume1/docker/mysql/7056/config:/etc/mysql:rw \
--volume /volume1/docker/mysql/7056/data:/var/lib/mysql:rw \
--volume /volume1/docker/mysql/7056/mysql-files:/var/lib/mysql-files:rw \
--volume /volume1/docker/mysql/7056/logs:/var/logs/mysql:rw \
--volume /volume1/docker/mysql/7056/logs:/var/log \
--volume /volume1/docker/mysql/7056/logs:/logs \
-v /etc/localtime:/etc/localtime:ro \
--lower_case_table_names=1 \
--initialize --lower-case-table-names=1
只有在初始化的时候设置 lower_case_table_names=1才有
docker-compose 7056
创建目录结构
[[0803 MySQL#物理目录创建 7056]]
配置文件
cat >/volume1/docker/dockercompose/mysql7056/docker-compose.yml<<'EOF'
version: '3'
services:
docker-mysql:
image: 'mysql:8.0.26'
container_name: mysql7056
privileged: true
restart: on-failure:3
environment:
- MYSQL_ROOT_PASSWORD=123456
volumes:
- /volume1/docker/mysql/7056/data/:/var/lib/mysql/
- /volume1/docker/mysql/7056/conf/my.cnf:/etc/mysql/my.cnf
- /volume1/docker/mysql/7056/initdb/:/docker-entrypoint-initdb.d/
ports:
- '3306:3306'
command: mysqld --lower_case_table_names=1 --skip-ssl --character_set_server=utf8mb4 --explicit_defaults_for_timestamp
EOF
cat /volume1/docker/dockercompose/mysql7056/docker-compose.yml
运行镜像
cd /volume1/docker/dockercompose/mysql7056
docker-compose up -d
# 后台运行模式,可以从 docker/docker-compose 的日志中获取默认管理员账户用户名和密码
docker-compose up
# 或者,直接运行,log 将会直接输出在当前控制台中,请注意退出之后保持当前容器运行
# 对整个项目操作启动
docker-compose up 服务id
# 对当前docker-compose中对于的服务id操作
docker-compose -f ./docker-compose.a.yaml -f ./docker-compse.b.yaml up -d
# 多个docker-compose.yaml配置文件创建容器
docker stack deploy -c docker-compose.yml mystack
# 使用Docker堆栈
重启
cd /volume1/docker/dockercompose/mysql7056 && \
docker-compose restart && \
docker logs -f mysql7056
cd /volume1/docker/dockercompose/mysql7056 && \
docker-compose stop && \
docker-compose start && \
docker logs -f mysql7056
更新
关闭当前运行的容器,此步骤不会删除挂载的配置文件以及相关目录
cd /volume1/docker/dockercompose/mysql7056 && \
docker-compose stop && \
docker-compose up -d --build && \
docker logs -f mysql7056
docker-compose down
# 关闭所有容器
# 如果docker-compose down时提示错误
# ERROR: network xxxxl has active endpoints
docker network inspect {network}
# 命令获取{endpoint-name}
docker network disconnect -f {network} {endpoint-name}
# docker network disconnect -f laradock_backend laradock_php-client_1
docker-compose down 服务id
# 关闭某一个服务
6. 日志查询
日志查询
docker logs -f mysql7056
docker logs --tail 10 mysql7056
docker stop mysql7056 && docker rm mysql7056
docker restart mysql7056
密码查询
docker logs mysql7056 2>&1|grep password
配置相关查询
docker logs mysql7056 2>&1|grep my.cnf
docker logs mysql7056 2>&1|grep Warning
7. 容器访问
容器后台
docker exec -it mysql7056 /bin/bash
修改Mysql初始化密码
修改Mysql密码
进入容器后台后操作
# mysql -uroot -p
# mysql -uroot -p123456
# mysql -uroot -p123456 --port=7056
mysql -uroot -p123456 -h127.0.0.1 -P7056
# /data/mysql_7056/bin/mysql --socket=/data/mysql_7056/run/mysql.sock --port=7056 -u root -p
# linux下访问
use mysql;
select host,user,authentication_string,plugin from user;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
ALTER USER 'root'@'localhost' IDENTIFIED with mysql_native_password by '123456';
select host,user,authentication_string,plugin from user;
flush privileges;
exit
设置Mysql远程访问
进入容器后台后操作
mysql --port=7056 -uroot -p123456
use mysql;
select host,user,authentication_string,plugin from user;
update user set plugin='mysql_native_password' where user = 'root' and host='%';
select host,user,authentication_string,plugin from user;
flush privileges;
exit
Mysql命令
数据库版本查询
进入数据库前操作
mysql -?
mysql --help
mysql -I
mysql --version
mysql -V
其它Mysql命令
进入数据库后操作
create user 'root'@'%' identified by '123456';
grant all on *.* to 'root'@'%';
show global variables like 'port';
select version();
show databases;
show variables like '%socket%';
show variables like '%port%';
show variables like 'datadir';
show variables like '%skip_name_resolve%';
show variables like '%host_cache%';
show global variables like 'authentication_policy';
show global variables like 'default_authentication_plugin';
show variables like 'innodb_log_files_in_group';
select uuid();
Tips: 如果从服务器是克隆的主服务器,那么server-uuid
的值肯定是一样的,不然后面主从复制报错误1593,修改以后重启mysql,server-uuid
通过my.cnf
修改,同时还可以配置mysqlx_socket
,mysqlx_port
等.
远程登录mysql
mysql -uroot -p密码 -hip -P端口
mysql -uroot -p密码 -hip --port=端口
mysql -uroot -p123456 -h127.0.0.1 -P7056
创建用户
格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码";
例1:增加一个test1用户,密码为123456,可以在任何主机上登录,并对所有数据库有查询,增加,修改和删除的功能。需要在mysql的root用户下进行
grant select,insert,update,delete on *.* to test1@"%" identified by "123456";
例2:增加一个test2用户,密码为123456,只能在192.168.2.12上登录,并对数据库student有查询,增加,修改和删除的功能。需要在mysql的root用户下进行
grant select,insert,update,delete on student.* to test2@192.168.2.12 identified by “123456″;
例3:授权用户test3拥有数据库student的所有权限
grant all privileges on student.* to test3@localhost identified by ’123456′;
修改用户密码
update mysql.user set password=password(’123456′) where User=’test1′ and Host=’localhost’;
删除用户
delete from user where user=’test2′ and host=’localhost’;
删除数据库和删除表
drop database 数据库名;
drop table 表名;
删除账户及权限
drop user 用户名@’%’
drop user 用户名@localhost
评论区