侧边栏壁纸
  • 累计撰写 2 篇文章
  • 累计创建 0 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

Docker - MySQL8.*

kinsong
2022-11-11 / 0 评论 / 0 点赞 / 1,918 阅读 / 3,133 字

1. 说明

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型和大型网站的开发都选择 MySQL 作为网站数据库。

2. 版本信息

Version: mysql:8.0.30
MySQL

自定义版本信息

应用位置 服务名称 版本信息 备注 字符集 排序规则
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
  1. 最大字符长度为3字节,如果遇到4字节的字符就会出现错误了
  2. 无法存贮表情和不常用汉字
  • utf8mb4
  1. 最大字符长度为4字节
  2. 对于 CHAR 类型数据,存储会多消耗一些空间
  3. 多了表情的支持

排序规则utf8mb4_unicode_ci

  1. 后缀ci:不区分大小写
  2. 后缀bin:区分大小写
  3. general_ci:不支持扩展,准确性相对于Unicode_ci来说要低一点,速度快于Unicode_ci
  4. unicode_ci:支持扩展,准确性高于general_ci,速度慢于general_ci

主从,数据持久化

Master对外映射的端口号是3306,Slave对外映射的端口号是3306,大家可以自己随意设置。因为docker容器是相互隔离的,每个容器有其独立的IP地址,所以不同容器使用相同的端口并不会冲突。如果是在生产环境,肯定是在不同的机器上安装MySQL,相对来说会简单一些

3. 参考资料

docker

Docker Hub

MySQL docker hub
MySQL docker hub tags

其它资料

其它资料1
其它资料2
其它资料3
其它资料4
其它资料5

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
0

评论区