docker安装mysql

  1. 下载mysql8.0docker镜像
    docker pull mysql:8.0
  2. 创建挂载目录
    mkdir -p /mnt/appdata/mysql/conf
    mkdir -p /mnt/appdata/mysql/data
    mkdir -p /mnt/appdata/mysql/logs
  3. 创建my.cnf文件,放在 /mnt/appdata/mysql/conf 目录中,注意配置文件中的端口号、字符集、时区,编辑my.cnf
[client]
port = 3306
default-character-set = utf8mb4

[mysql]
port = 3306
default-character-set = utf8mb4

[mysqld]
;bind-address = 0.0.0.0
;port = 3306
datadir=/opt/mysql/data
log_error = /logs/mysqld.log
general_log = 1
general_log_file = /logs/general.log
slow_query_log = 1
slow_query_log_file = /logs/slow_query.log

;skip-name-resolve用于控制 MySQL 是否尝试将主机名解析为 IP 地址。当设置为 ON 时,MySQL 会跳过对主机名的 DNS 解析,直接使用提供的主机名进行连接。这通常用于性能优化或避免 DNS 解析问题。
skip-name-resolve

;sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
;default-storage-engine=MyISAM
default-storage-engine=INNODB

max_connections=10000

;character-set-client-handshake=FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

;设置时区和字符集
default-time-zone='+8:00'
init_connect='SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci'

innodb_flush_log_at_trx_commit=2
;innodb_log_file_size=128M
;innodb_log_files_in_group=2
innodb_redo_log_capacity=256M
;如果数据库服务器只使用InnoDB存储引擎,可以设置 innodb_buffer_pool_size 为60%-80%的内存
innodb_buffer_pool_size=4G
;当缓冲池大小大于1G时,设置 innodb_buffer_pool_instances 大于1的值可以提高服务器的可扩展性
;设置 innodb_buffer_pool_instances 大于1的值可以提高服务器的可扩展性,意味着将InnoDB缓冲池分割成多个较小的缓冲池实例,这样可以在多个CPU核心或处理器上并行处理数据,从而提高数据库的性能和可扩展性
;innodb_buffer_pool_instances:这个参数的设置与CPU核心数有关,用于提高并发性能和减少锁竞争。一般建议设置为CPU核心数的1到2倍,如果服务器有8个CPU核心,可以尝试将设置为8或16,但请注意,MySQL 8.0中的最大值是64
;从 MySQL 8.0 开始,innodb_buffer_pool_instances 配置选项已被废弃,因为 InnoDB 缓冲池的架构已经发生了变化。在旧版本中,这个选项用于设置缓冲池的实例数量,以提高并发性能和减少锁争用。但在 MySQL 8.0 及以后的版本中,InnoDB 缓冲池已经进行了重构,不再需要手动设置实例数量,InnoDB 会自动管理缓冲池的分区。
;innodb_buffer_pool_instances=4
innodb_write_io_threads=10
innodb_log_buffer_size=64M
innodb_io_capacity=5000
;innodb_thread_concurrency 用于限制 InnoDB 存储引擎可以同时运行的线程数量。这是一种防止高并发环境下数据库性能下降的手段,通过限制线程数来避免过度的上下文切换和资源争用。然而,在 MySQL 的后续版本中,InnoDB 存储引擎的并发控制机制已经得到改进,不再需要手动设置这个值。InnoDB 现在可以更智能地管理并发线程,根据系统资源和工作负载自动调整线程数量。
;innodb_thread_concurrency=8

tmp_table_size=18M
thread_cache_size=8
;myisam_max_sort_file_size指定了在使用 MyISAM 存储引擎创建索引时,临时文件的最大大小。当创建索引涉及的数据量超过这个值时,MySQL 会将数据分割成多个临时文件来排序,这个变量的设置对于防止在索引创建过程中使用过多磁盘空间
myisam_max_sort_file_size=4G
myisam_sort_buffer_size=35M
key_buffer_size     = 64M
max_allowed_packet  = 1G
thread_stack        = 512K
net_buffer_length = 128K
;thread_cache_size       = -1
read_buffer_size=64K
read_rnd_buffer_size=256K
sort_buffer_size=256K
bulk_insert_buffer_size=512M

gtid-mode=ON
enforce-gtid-consistency = ON
  1. 启动镜像

    docker run \
    -p 3306:3306 \
    --name mysql \
    --restart=always \
    -e TZ="Asia/Shanghai" \
    -v /mnt/appdata/mysql/conf:/etc/mysql/conf.d \
    -v /mnt/appdata/mysql/logs:/logs \
    -v /mnt/appdata/mysql/data:/opt/mysql/data \
    -e MYSQL_ROOT_PASSWORD=123456 \
    -d mysql:8.0
    docker run \
    -p 3306:3306 \
    --name mysql \
    --restart=always \
    -e TZ="Asia/Shanghai" \
    -v /mnt/appdata/mysql/conf:/etc/mysql/conf.d \
    -v /mnt/appdata/mysql/logs:/logs \
    -v /mnt/appdata/mysql/data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=123456 \
    -d mysql:8.0
  2. 启动镜像忽略大小写(--lower_case_table_names=1)

    docker run \
    -p 3306:3306 \
    --name mysql \
    --restart=always \
    -e TZ="Asia/Shanghai" \
    -v /mnt/appdata/mysql/conf:/etc/mysql/conf.d \
    -v /mnt/appdata/mysql/logs:/logs \
    -v /mnt/appdata/mysql/data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=123456 \
    -d mysql:8.0 \
    --lower_case_table_names=1
  3. 数据库记录时间晚8小时解决办法
    6.1 更改容器时间-01,亲测可用

    [root@tseng ~]# docker exec -it mysql8.0 bash
    root@a498923c0bd3:/# date
    Tue Aug  3 06:44:32 UTC 2021
    root@a498923c0bd3:/# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    root@a498923c0bd3:/# exit
    [root@tseng /]# docker restart mysql8.0        -- 重启镜像
    [root@tseng /]# docker exec -it mysql8.0 bash    
    root@a498923c0bd3:/# date
    Tue Aug  3 14:45:35 CST 2021

6.2 更改容器时间-02

root@a498923c0bd3:/# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
或者
root@a498923c0bd3:/# systemctl enable ntpd
root@a498923c0bd3:/# systemctl start ntpd
或者
root@a498923c0bd3:/# timedatactl set-timezone Asia/Shanghai
若想改回UTC时间 删除/etc/localtime便可

6.3 临时更改mysql 时间-亲测可用,重启后失效

// 查看当前时间
select now();
// 设置全局
set global time_zone = '+8:00';
// 立即生效
flush privileges;
  1. 解决无法登录问题;登录mysql
    注:本人Mac navicat for mysql 不修改密码规则可连接成功,Win10无法连接成功,根据需要修改配置。
    1251 Client does not support authentication protocol requested by server
docker exec -it mysql8.0 bash
root@8e06ede28f4b:/# mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 8.0.26 MySQL Community Server - GPL

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

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>

mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> SELECT Host, User, plugin from user;
+-----------+------------------+-----------------------+
| Host      | User             | plugin                |
+-----------+------------------+-----------------------+
| %         | root             | caching_sha2_password |
| localhost | mysql.infoschema | caching_sha2_password |
| localhost | mysql.session    | caching_sha2_password |
| localhost | mysql.sys        | caching_sha2_password |
| localhost | root             | caching_sha2_password |
+-----------+------------------+-----------------------+
5 rows in set (0.00 sec)

//开启远程连接
CREATE USER 'root'@'%' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password

//修改密码加密规则
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';

//刷新权限,使修改的密码生效
FLUSH PRIVILEGES;

//查看密码加密规则是否生效
mysql> SELECT Host, User, plugin from user;
+-----------+------------------+-----------------------+
| Host      | User             | plugin                |
+-----------+------------------+-----------------------+
| %         | root             | mysql_native_password |
| localhost | mysql.infoschema | caching_sha2_password |
| localhost | mysql.session    | caching_sha2_password |
| localhost | mysql.sys        | caching_sha2_password |
| localhost | root             | mysql_native_password |
+-----------+------------------+-----------------------+
5 rows in set (0.00 sec)
  1. 出现:[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 解决
    【不重启mysql的解决】使用 select @@global.sql_mode; 查询功能依赖检测功能。如果启用了ONLY_FULL_GROUP_BY SQL模式(默认情况下),MySQL将拒绝选择列表,HAVING条件或ORDER BY列表的查询引用在GROUP BY子句中既未命名的非集合列,也不在功能上依赖于它们。(5.7.5之前,MySQL没有检测到功能依赖关系,默认情况下不启用。
    mysql> select @@global.sql_mode;
    +----------------------------------------------------------------------------------------------------+
    | @@global.sql_mode                                                                                  |
    +----------------------------------------------------------------------------------------------------+
    | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
    +----------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)

    去掉ONLY_FULL_GROUP_BY,重新设置值

    mysql> set @@global.sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
    Query OK, 0 rows affected (0.00 sec)
    mysql> select @@global.sql_mode;
    +----------------------------------------------------------------------------------------------------+
    | @@global.sql_mode                                                                                  |
    +----------------------------------------------------------------------------------------------------+
    | STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
    +----------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)

    【重启mysql的解决方案】修改my.cnf文件,在[mysqld] 下方添加以下规则,并重启mysql容器。同时重启mysql连接工具、连接程序重启。

    sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

mysql8启用root账号及远程连接

use mysql;
create user 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
;update user set host='%' where user='root';
GRANT ALL ON *.* TO 'root'@'%';
select host, user, authentication_string, plugin from user;
alter user root identified with mysql_native_password by '123456';
flush privileges;

mysql5.7忘记密码后重置

  1. 清空密码
    编辑配置文件my.cnf

    vim /etc/my.cnf
    skip-grant-tables       //在[mysqld]下面添加参数,设置无密码登录
    #重启服务
    systemctl restart mysqld
  2. 清空密码

    use mysql
    update user set authentication_string='' where  user = 'root';          //清空密码

    将配置skip-grant-tables 注释,并重启mysql,再次登录测试
    查看密码规则

    show variables like 'validate_password%';

    设置密码长度为6,密码验证强度为0/low

    set global validate_password_length=6;
    set global validate_password_policy=0;
  3. 设置密码为123456,并登录测试

    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
    ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

mysql 新建账号,删除账号,授权账号

在 MySQL 中,管理用户账号通常涉及创建新用户、删除用户、授予权限和撤销权限等操作。以下是一些基本的 SQL 命令,用于执行这些操作:

新建账号(创建新用户)

要创建一个新的 MySQL 用户,可以使用 CREATE USER 语句:

CREATE USER 'username'@'host' IDENTIFIED BY 'password';
  • username 是新用户的用户名。
  • host 是用户可以从哪个主机连接到 MySQL 服务器的主机名或 IP 地址。可以使用 localhost 表示用户只能从本地连接,或者使用 % 表示从任何主机连接。
  • password 是用户的密码。

示例

CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'newpassword';

删除账号(删除用户)

要删除一个 MySQL 用户,可以使用 DROP USER 语句:

DROP USER 'username'@'host';

示例

DROP USER 'newuser'@'localhost';

授权账号(授予权限)

授予用户权限,可以使用 GRANT 语句。这个命令可以授予各种权限,从非常具体的权限到完全的管理权限:

GRANT privileges ON database.table TO 'username'@'host';
  • privileges 是要授予的权限列表,例如 SELECT, INSERT, UPDATE, DELETE, ALL PRIVILEGES 等。
  • database 是数据库的名称,table 是可选的,如果指定,则权限仅适用于该表。
  • usernamehost 指定了权限授予给哪个用户和主机。

示例

GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'localhost';

这将授予 newuser 用户对所有数据库和表的所有权限。

撤销账号权限(撤销权限)

要撤销用户的权限,可以使用 REVOKE 语句:

REVOKE privileges ON database.table FROM 'username'@'host';

示例

REVOKE ALL PRIVILEGES ON *.* FROM 'newuser'@'localhost';

这将撤销之前授予 newuser 用户的所有全局权限。

刷新权限

在授予或撤销权限后,需要刷新权限,使更改立即生效:

FLUSH PRIVILEGES;

设置密码

要为用户设置或更改密码,可以使用 ALTER USER 语句:

ALTER USER 'username'@'host' IDENTIFIED BY 'newpassword';

示例

ALTER USER 'newuser'@'localhost' IDENTIFIED BY 'newpassword';

注意事项

  • 执行这些操作的用户必须拥有足够的权限来管理用户和授予权限。
  • 出于安全考虑,建议不要给用户过多的权限,始终遵循最小权限原则。
  • 在执行任何可能影响数据的操作之前,确保已经备份了数据库。

使用这些命令时,请确保你了解它们的含义和潜在的影响,并且遵循了最佳安全实践。