Press "Enter" to skip to content

Mysql安装

mysql安装

在./docker-compose中,增加service,实例如下

version: "3.7"
services:
  # mysql数据库
  mysql:
    image: mysql:5.7.35
    container_name: "mysql"
    environment:
      # root 密码 
      - MYSQL_ROOT_PASSWORD=h!AlL608nGLnY3Abe0KL
      # 时区
      - TZ=Asia/Shanghai
    volumes:
      # 数据及配置挂载到容器,在第一次启动容器后,复制出来,然后重建容器
      # - ./mysql/lib/mysql:/var/lib/mysql
      # - ./mysql/conf.d:/etc/mysql/conf.d
    logging:
      driver: json-file
      options:
        max-size: "10M"
        max-file: "10"
    restart: always

数据及配置挂载

  • 复制容器文件到主机
cd mysql;
# 复制数据
docker cp mysql:/var/lib/mysql ./lib
# 复制配置
docker cp mysql:/etc/mysql/conf.d ./
# 修改docker-compose volumes
volumes:
  - ./mysql/lib/mysql:/var/lib/mysql
  - ./mysql/conf.d:/etc/mysql/conf.d

mysql配置

需要修改./mysql/conf.d/my.cnf

  • 因为mysql5.7以后,mysql的sql_mode默认配置为ONLY_FULL_GROUP_BY,该值表示:对于使用 GROUP BY 进行查询的SQL,不允许 SELECT 部分出现 GROUP BY 中未出现的字段
[mysqld]
sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

解释

  • STRICT_TRANS_TABLES,选项针对事务性存储引擎生效,对于非事务性存储引擎无效,该选项表示开启strict sql模式
  • ERROR_FOR_DIVISION_BY_ZERO,INSERT或者UPDATE语句中,如果数据被0除,则出现警告(非strict sql模式下)或者错误(strict sql模式下)
  • NO_AUTO_CREATE_USER,之前版本中使用GRANT语法,如果用户不存在则会自动创建用户,该选项限制该功能
  • NO_ENGINE_SUBSTITUTION,在使用CREATE TABLE或者ALTER TABLE语法执行存储引擎的时候,如果设定的存储引擎被禁用或者未编译,会产生错误。

严格模式下,mysql自身会对数据进行严格的校验(格式、长度、类型等),比如一个整型字段我们写入一个字符串类型的数据,在非严格模式下MySQL不会报错,同样如果定义了char或varchar类型的字段,当写入或更新的数据超过了定义的长度也不会报错。我认为这个对于编程来说没有任何好处,虽然我们尽量在代码中做数据校验。MySQL开启了严格模式从一定程序上来讲师对我们代码的一种测试,如果我们的开发环境没有开启严格模式在开发过程中也没有遇到错误,那么在上线或代码移植的时候将有可能出现不兼容的情况,因此在开发过程做最好开启MySQL的严格模式。