Docker安装mysql8.0

一、下载mysql:8.0镜像

#检查docker是否可以下载mysql镜像
docker search mysql
#下载mysql8.0镜像
docker pull mysql:8.0

二、安装运行mysql8.0容器

docker run -p 3306:3306 --name mysql8 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0
-p:端口号
-e:root密码
-d:指定安装镜像
#如果设置不区分大小写,运行下面代码,拷贝data文件之前就要执行,否则报错
docker run -p 3306:3306 --name mysql8 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0 --lower_case_table_names=1

三、拷贝容器文件到本地

#拷贝mysql配置文件到本地
docker cp mysql8:/etc/mysql /usr/local/src/docker/mysql/config
#拷贝mysql配置文件数据源到本地
docker cp mysql8:/var/lib/mysql /usr/local/src/docker/mysql/data
#在本地创建logs日志存储文件
#创建错误日志存放文件
mkdir -p /usr/local/src/docker/mysql/logs/error/
touch /usr/local/src/docker/mysql/logs/error/error_log.log

#不建议改
#创建查询日志存放地址  原地址/var/lib/mysql/9056323b388c.log 最好复制源文件否则有权限问题
#在外部加了mysql权限没成功,直接在运行容器时加了--privilged  也没成功
mkdir -p /usr/local/src/docker/mysql/logs/general/
touch /usr/local/src/docker/mysql/logs/general/mysql_general.log
#创建慢查询日志存放文件 原本存在/var/lib/mysql/9056323b388c-slow.log 最好复制源文件否则有问题
mkdir -p /usr/local/src/docker/mysql/logs/show_query/
touch /usr/local/src/docker/mysql/logs/show_query/show_query.log
#给日志赋权限
chmod 777 /usr/local/src/docker/mysql/logs/error/error_log.log
chmod 777 /usr/local/src/docker/mysql/logs/general/mysql_general.log
chmod 777 /usr/local/src/docker/mysql/logs/show_query/show_query.log

#chmod -R 777 /usr/local/src/docker/mysql/logs/

四、配置mysql配置文件

my.cnf配置参考:

#配置mysql my.cnf文件
vim /usr/local/src/docker/mysql/config/my.cnf
####################my.cnf##################
[mysqld]
#pid-file 指定将进程 ID 写入的文件的路径,以便其他程序或脚本可以轻松地访问该文件并使用 MySQL 服务器进程的 PID
pid-file        = /var/run/mysqld/mysqld.pid   
#MySQL 在本地可以通过 socket 方式连接,如果 my.cnf 配置文件中的 [client] 部分没有指定 socket 文件路径,mysql 默认会去寻找 /tmp/mysql.sock ,为了安全考虑,通常会设置特定的socket路径
socket          = /var/run/mysqld/mysqld.sock
#数据目录文件,需要保证它的权限和目录大小
datadir         = /var/lib/mysql
#指定允许读取和写入的目录位置
secure-file-priv= NULL

user = mysql    #mysql用户
prot = 3306     #mysql端口号
#选项可以用来指定 MySQL 服务器应该使用哪种身份验证方式和插件
authentication_policy=mysql_native_password

server_id = 3306     #mysql服务的ID 一般用于主从 具有唯一性

character_set_server = UTF8MB4 #指定 MySQL 服务器使用的默认字符集
skip_name_resolve = 1
#admin-address 选项定义了一个或多个管理员的联系信息,以便 MySQL 服务器可以向其发送通知或警报。这些联系信息通常包括电子邮件地址和名称,但也可以包括其他信息,如电话号码等。
#admin_address = '127.0.0.1'
#admin_port = 33062

#lower_case_table_names 的取值有以下几种
#0:表名使用大小写敏感的方式处理。
#1:表名在存储时将被转换为小写字母,但在检索时保持原样,此时如果存在大小写相同但是内容不同的表名,将会出现错误。
#2:表名在存储和检索时都将被转换为小写字母,这样可以避免大小写不匹配的问题,但可能导致表名冲突。
需要注意的是,lower_case_table_names 选项对已经存在的表名不会产生影响,只会影响新创建的表名。如果在 MySQL 数据库中已经存在表名,应该在设置 lower_case_table_names 选项之前备份数据,并进行相应的调整。
lower_case_table_name = 2
#local-infile 控制是否允许在客户端本地加载数据文件,即将数据文件从客户端传输到服务器,然后使用LOAD DATA INFILE语句将数据加载到 MySQL 表中。选项被设置为 ON,则允许在客户端本地加载数据文件。如果该选项被设置为 OFF,则不允许在客户端本地加载数据文件。
local-infile = no



lock_wait_timeout = 3600        #事务锁等待超时时间
open_files_limit = 65535        #操作系统对mysqld可用的文件描述符的限制
back_log = 1024                 #表示在 MySQL 暂时停止响应新请求之前的这段短时间内可以堆叠多少请求
max_connections = 10240         #mysql接受的最大连接数
max_connect_errors = 1000000    #来自主机的连续连接请求在没有成功连接的情况下被中断后 服务器阻止该主机进一步连接
table_open_cache = 20000        #所有线程打开表的数量
table_definition_cache = 2000   #增加这个参数加速打开表的速度
thread_stack = 512k             #每个线程的堆栈大小。如果线程堆栈大小太小,它会限制服务器可以处理的 SQL 语句的复杂性、存储过程的递归深度以及其他消耗内存的操作。默认值(64 位平台,≥ 8.0.27) 1048576   默认值(64 位平台,≤ 8.0.26) 286720
sort_buffer_size = 2M           #每个必须执行排序的会话都会分配一个此大小的缓冲区 增加该值加速order by 或group by 的速度
#join_buffer_size = 4M
#read_buffer_size = 8M
#read_rnd_buffer_size = 4M
#bulk_insert_buffer_size = 64M

thread_cache_size = 256         #服务区缓存线程的数量 当客户端断开连接时,如果客户端的线程少于 thread_cache_size线程,则将其放入缓存中。如果可能,通过重用从缓存中获取的线程来满足对线程的请求,并且只有当缓存为空时才会创建新线程,默认值公式 上限为 100:
#interactive_timeout = 600
#wait_timeout = 600
tmp_table_size 32M              #存储引擎创建的内部内存临时表的最大大小MEMORY
max_heap_table_size = 32M

#log settings
log_timestamps = SYSTEM        #log中日志文件记录时间戳的时区 Default Value UTC
log_error = /var/log/mysql/mysql-error.log    ##错误日志路径
log_error_verbosity = 3        #日志输出等级 log_error_verbosity Value Permitted Message Priorities  1 ERROR    2 ERROR, WARNING    3 ERROR, WARNING, INFORMATION
slow_query_log = 1   #慢日志开启
log_slow_extra = 1 #输出额外信息到slow log中  Thread_id: ID Errno: error_number Bytes_received: N Bytes_sent: N
show_query_log_file = /var/log/mysql/mysql-slow.log  #慢查询的存放路径
long_query_time = 0.1  #慢查询阈值
#log_queries_not_using_indexes = 1 
#log_throttle_queries_not_using_indexes = 60
#min_examined_row_limit = 100
log_slow_admin_statements = 1 #记录以下语句慢查询ALTER TABLE、 ANALYZE TABLE、 CHECK TABLE、 CREATE INDEX、 DROP INDEX、 OPTIMIZE TABLE和 REPAIR TABLE。
log_show_replica_statements = 1

log_bin = /var/log/mysql/mysql_bin        #开启binlog
binlog_format = ROW                       #binlog 格式
sync_binlog = 1000    #sync_binlog=0:禁用MySQL服务器将二进制日志同步到磁盘。相反,MySQL 服务器依靠操作系统不时将二进制日志刷新到磁盘,就像它对任何其他文件所做的那样。此设置提供最佳性能,但在电源故障或操作系统崩溃的情况下,服务器可能已提交尚未同步到二进制日志的事务。
#sync_binlog=1:在提交事务之前启用二进制日志到磁盘的同步。这是最安全的设置,但由于磁盘写入次数增加,可能会对性能产生负面影响。在电源故障或操作系统崩溃的情况下,二进制日志中丢失的事务仅处于准备状态。这允许自动恢复例程回滚事务,从而保证二进制日志中不会丢失任何事务。
#sync_binlog=N,其中N是 0 或 1 以外的值:二进制日志在 N收集二进制日志提交组后同步到磁盘。在电源故障或操作系统崩溃的情况下,服务器可能已提交尚未刷新到二进制日志的事务。由于磁盘写入次数增加,此设置可能会对性能产生负面影响。较高的值可提高性能,但会增加数据丢失的风险。





binlog_cache_size = 4M #事务期间用于保存二进制日志更改的内存缓冲区的大小。
max_binlog_cache_size = 2G #如果一个事务需要超过这个字节数的内存,服务器会生成一个Multi-statement transaction required more than ‘max_binlog_cache_size’ bytes of storage错误
最大推荐值为4GB;这是因为 MySQL 当前无法处理大于 4GB 的二进制日志位置
max_binlog_size = 1G      #如果写入二进制日志导致当前日志文件大小超过此变量的值,则服务器轮换二进制日志(关闭当前文件并打开下一个文件)
binlog_rows_query_log_events = 1     #把sql语句打印到binlog日志里面
binlog_expire_logs_seconds = 604800  #设置binlog过期时间 单位 秒

#mysql 8.0.22前,想用MGR的话需要设置binlog_checksum=NONE才醒
binlog_checksum = CRC32

#myisam settings
key_buffer_size = 32M
mysiam_sort_buffer_size = 128M
replication settings
relay_log = /data/logs01/relaylog
relay_log_index = /data/logs01/mysqld_relay_bin.index
relay_log_recovery = 1
replica_parallel_type = LOGICAL_CLOCK
replica_parallel_workers = 16 #可以设置为逻辑CPU数量的2倍
binlog_transaction_dependency_tracking = WRITESET
replica_preserve_commit_order = 1
replica_checkpoint_period  = 2
skip_replica_start = ON
read_only = 0 
gtid_mode = ON
enforce_gtid_consistency = ON
replica_transaction_retries    = 128
#
#
##mgr settings
##loose-plugin_load_add = 'mysql_clone.so'
##loose-plugin_load_add = 'group_replication.so'
##loose-group_replication_group_name = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa1"
##MGR本地节点IP:PORT,请自行替换
##loose-group_replication_local_address = "172.16.16.10:33061"
##MGR集群所有节点IP:PORT,请自行替换
##loose-group_replication_group_seeds = "172.16.16.10:33061,172.16.16.11:33061,172.16.16.12:33061"
##loose-group_replication_start_on_boot = OFF
##loose-group_replication_bootstrap_group = OFF
##loose-group_replication_exit_state_action = READ_ONLY
##loose-group_replication_flow_control_mode = "DISABLED"
##loose-group_replication_single_primary_mode = ON
##loose-group_replication_communication_max_message_size = 10M
##loose-group_replication_unreachable_majority_timeout = 30
##loose-group_replication_member_expel_timeout = 5
##loose-group_replication_autorejoin_tries = 288
#
#innodb settings  innodb设置
transaction_isolation = REPEATABLE-READ
innodb_buffer_pool_size = 8G
innodb_buffer_pool_instances = 8
innodb_data_file_path = ibdata1:2G;ibdata2:2G;ibdata3:2G;ibdata4:2G;ibdata5:16M:autoextend
innodb_flush_log_at_trx_commit = 2 #MGR环境中由其他节点提供容错性,可不设置双1以提高本地节点性能
innodb_log_buffer_size = 500M
innodb_log_file_size = 2G #如果线上环境的TPS较高,建议加大至1G以上,如果压力不大可以调小
innodb_log_files_in_group = 2
innodb_max_undo_log_size = 4G
innodb_thread_concurrency = 0
innodb_read_io_threads = 48
innodb_write_io_threads = 48
innodb_commit_concurrency = 48
# 根据您的服务器IOPS能力适当调整
# 一般配普通SSD盘的话,可以调整到 10000 - 20000
# 配置高端PCIe SSD卡的话,则可以调整的更高,比如 50000 - 80000
innodb_io_capacity = 20000
innodb_io_capacity_max = 50000
innodb_open_files = 65535
innodb_flush_method = O_DIRECT
innodb_buffer_pool_dump_pct = 75
#Innodb_io_capacity/innodb_buffer_pool_instances Innodb_io_capacity>innodb_lru_scan_depth*innodb_buffer_pool_instance
innodb_lru_scan_depth = 4000
#innodb_lock_wait_timeout = 10
#innodb_rollback_on_timeout = 1
innodb_print_all_deadlocks = 1
innodb_online_alter_log_max_size = 1G
innodb_print_ddl_logs = 1
innodb_status_file = 1
#注意: 开启 innodb_status_output & innodb_status_output_locks 后, 可能会导致log_error文件增长较快
#innodb_status_output = 0
innodb_status_output_locks = 1
innodb_sort_buffer_size = 67108864
innodb_adaptive_hash_index = OFF
#提高索引统计信息精确度
innodb_stats_persistent_sample_pages = 500

#innodb monitor settings   innodb监视器设置
innodb_monitor_enable = "module_innodb"
innodb_monitor_enable = "module_server"
innodb_monitor_enable = "module_dml"
innodb_monitor_enable = "module_ddl"
innodb_monitor_enable = "module_trx"
innodb_monitor_enable = "module_os"
innodb_monitor_enable = "module_purge"
innodb_monitor_enable = "module_log"
innodb_monitor_enable = "module_lock"
innodb_monitor_enable = "module_buffer"
innodb_monitor_enable = "module_index"
innodb_monitor_enable = "module_ibuf_system"
innodb_monitor_enable = "module_buffer_page"
#innodb_monitor_enable = "module_adaptive_hash"

#pfs settings #pfs设置
performance_schema = 1
##performance_schema_instrument = '%memory%=on'
performance_schema_instrument = '%lock%=on'

[mysqldump]
quick


# Custom config should go here
!includedir /etc/mysql/conf.d/

 配置conf.d/mysql.cnf

#配置mysql.cnf
vim /usr/local/src/docker/mysql/config/conf.d/mysql.cnf
##############################
[mysql]
prompt = "\\u@\\d \\r:\\m:\\s>"
no_auto_rehash
loose-skip-binary-as-hex
################################
prompt = "\\u@\\d \\r:\\m:\\s>"   #设置命令行工具的提示符 默认为 mysql>
no_auto_rehash                    #命令行工具中的自动命令补全功能
loose-skip-binary-as-hex          #

配置my.cnf 详解

#配置mysql my.cnf文件
vim /usr/local/src/docker/mysql/config/my.cnf
####################my.cnf##################
[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL
  
#mysql服务端口号        
prot = 3306
#管理多因素身份认证功能 
#mysql 8 默认 caching_sha2_password   mysql 5 默认 mysql_native_password
authentication_policy=caching_sha2_password



#server级别字符集,服务器安装时指定的默认编码格式,不要人为定义,让系统自己定义
character-set-server = utf8mb4
#设置字段编码
collation-server = utf8mb4_general_ci
#设置初始化连接编码
init_connect='SET NAMES utf8mb4'


#设置大小写是否敏感的参数  0 区分大小写| 1 表明存储是小写,但是比较不区分大小写, 2 表名存储为给定的大小写但是比较是小写。unix\linux默认是0 windows默认是1 mac默认是2
lower_case_table_names = 1
#innodb使用后台线程处理数据页的读取IO(输入输出请求),根据cpu核数来更改默认是4
innodb_read_io_threads = 4
#数据库落盘脏页个数,配置压力和磁盘性能相关,如果过大,IO能力不足,则出现卡顿,默认是200单位是页,该参数设置大小取决于硬盘的IOPS,即每秒的输入输出量或读写次数。动态调整: set global innodb_io_capacity=2000;
innodb_io_capacity = 400
#定义innodb存储引擎的表数据和索引数据的最大内存缓冲区,看机器内存情况定
#InnoDB缓存池缓存索引、行的数据、自适应哈希索引、插入缓存(Insert Buffer)、锁 还有其他的内部数据结构。(所以,如果数据库的数据量不大,并且没有快速增长,就不必为缓存池分配过多的内存,当为缓存池配置的内存比需要缓存的表和索引大很多也没什么必要,会造成资源浪费。)
#a.很大的缓存池可能会有很多脏页,导致InnoDB在关闭的时候会消耗很长的时间,因为要把脏页写回到数据文件里
#b.一个大的缓存池重启服务器可能也要比较长的时间用来预热缓冲池,当然Percona的Server有快速预热的功能可以节省很多时间。
innodb_buffer_pool_size = 2G
#每个日志文件的大小,综合大小到缓冲池大小的5%~100%,避免日志覆写上不必要的缓冲池刷新行为。注意一个大的日志文件大小会增加恢复进程所需要的时间
innodb_log_file_size = 128M
#独立表空间模式,每个数据库的没表表都会生成一个数据空间
innodb_file_per_table = 1


#此参数用来设置innodb线程的并发数,比如处理请求连接,默认值是0不限制,若要设置则与服务器cpu核心数相同或者是cpu核心数的2倍,合理修改会提升mysql的性能,最大是cpu核的两倍(常用设置),如果超过配置并发数则需要排队,这个值不宜太大,不然可能会导致线程之间锁争用严重,影响性能
innodb_thread_concurrency=4

#innodb存储引擎下 Buffer Pool缓存大小,一般为屋里内存的60%-70%
innodb_buffer_pool_size=30G

#innodb存储引擎下,行锁锁定时间,默认50s,根据公司业务定,没有标准值。如果一个事务在超过改时间后任然无法获取锁,那么该事务会被取消,并返回一个错误消息。如果系统有大量并发事务,并且经常出现锁等待超时的问题,那么可以调整该参数的值来降低锁等待时间,提高系统并发度。
innodb_lock_wait_timeout=10

#如果设置为 1 ,InnoDB 会在每次提交后刷新(fsync)事务日志到磁盘上,这提供了完整的 ACID 行为.如果你愿意对事务安全折衷, 并且你正在运行一个小的食物, 你可以设置此值到 0 或者 2 来减少由事务日志引起的磁盘 I/O
innodb_flush_log_at_trx_commit = 0
#innodb_flush_log_at_trx_commit:是 InnoDB 引擎特有的,ib_logfile的刷新方式( ib_logfile:记录的是redo log和undo log的信息)
#取值:0/1/2
#innodb_flush_log_at_trx_commit=0,表示每隔一秒把log buffer刷到文件系统中(os buffer)去,并且调用文件系统的“flush”操作将缓存刷新到磁盘上去。也就是说一秒之前的日志都保存在日志缓冲区,也就是内存上,如果机器宕掉,可能丢失1秒的事务数据。
#innodb_flush_log_at_trx_commit=1,表示在每次事务提交的时候,都把log buffer刷到文件系统中(os buffer)去,并且调用文件系统的“flush”操作将缓存刷新到磁盘上去。这样的话,数据库对IO的要求就非常高了,如果底层的硬件提供的IOPS比较差,那么MySQL数据库的并发很快就会由于硬件IO的问题而无法提升。
#innodb_flush_log_at_trx_commit=2,表示在每次事务提交的时候会把log buffer刷到文件系统中去,但并不会立即刷写到磁盘。如果只是MySQL数据库挂掉了,由于文件系统没有问题,那么对应的事务数据并没有丢失。只有在数据库所在的主机操作系统损坏或者突然掉电的情况下,数据库的事务数据可能丢失1秒之类的事务数据。这样的好处,减少了事务数据丢失的概率,而对底层硬件的IO要求也没有那么高(log buffer写到文件系统中,一般只是从log buffer的内存转移的文件系统的内存缓存中,对底层IO没有压力)。


sync_binlog = 1
#sync_binlog:是MySQL 的二进制日志(binary log)同步到磁盘的频率。
#取值:0-N
#sync_binlog=0,当事务提交之后,MySQL不做fsync之类的磁盘同步指令刷新binlog_cache中的信息到磁盘,而让Filesystem自行决定什么时候来做同步,或者cache满了之后才同步到磁盘。这个是性能最好的。
#sync_binlog=1,当每进行1次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。
#sync_binlog=n,当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。
#注:大多数情况下,对数据的一致性并没有很严格的要求,所以并不会把 sync_binlog 配置成 1. 为了追求高并发,提升性能,可以设置为 100 或直接用 0. 
而和 innodb_flush_log_at_trx_commit 一样,对于支付服务这样的应用,还是比较推荐 sync_binlog = 1.




#索引缓冲区大小,增加他可得到更好的索引处理性能,如果是以InnoDB引擎为主的DB专用于MyISAM引擎的可以设置较小,8MB已足够,如果是MyISAM引擎为主可以设置较大,但不能超过4G,强烈不建议MyISAM引擎默认都是InnoDB引擎。注意:该参数值过大反而会使服务器整体效率降低
key_buffer_size = 512M

#控制是否允许从客户端加载数据(大批量数据加载优化)到MySQL服务器。默认情况下,此选项处于禁用状态 on 禁用 off开启。当启用local-infile选项后,客户端可以使用LOAD DATA INFILE语句将本地文件中的数据加载到MySQL服务器中.
local-infile = on

#指定链接空闲多长时间断开
lock_wait_timeout = 3600


#当此值设置为10时,意味着如果某一客户端尝试连接此MySQL服务器,但是失败(如密码错误等等)10次,则MySQL会无条件强制阻止此客户端连接。
#如果希望重置此计数器的值,则必须重启MySQL服务器或者在mysql服务执行命令 FLUSH HOSTS;
max_connect_errors = 10


#表描述符的缓存大小,打卡一个标后会把这个表的文件描述缓存下来 动态查看 show global variables like 'table_open_cache'  动态设置 set global table_open_cache = 2048; (重启生效)
table_open_cache = 20000
#table open cache的值可以通过 opened_tables(打开的所有表数量)和open_tables(打开后缓存中的标数量)来判断值是否达到瓶颈,当缓存中的值open_tables 临近到了 table_open_cache 值的时候
#说明表缓存池快要满了 但 Opened_tables 还在一直有新的增长 这说明你还有很多未被缓存的表
#这时可以适当增加 table_open_cache 的大小

#对 InnoDB 数据字典缓存中打开的表实例数量进行软限制。即,如果打开的表实例的数量超过table_definition_cache 设置,则 LRU 机制标记表实例并最终从数据字典缓存中删除。该限制有助于缓解大量内存被极少使用的表实例占用的情况,注意:具有缓存元数据的表实例数可能高于table_definition_cache 定义的限制,因为带有外键关系的 InnoDB 系统表实例和具有父子关系的表实例不会放在 LRU 列表上,无法通过从内存中逐出这些表实例来减
table_definition_cache = 2000


#每个连接线程被创建时,MySQL给它分配的内存大小.当MySQL创建一个新的连接线程时,需要给它分配一定大小的内存堆栈空间,以便存放客户端的请求的Query及自身的各种状态和处理信息.
#查看连接线程相关的系统变量的设置值: show variables like 'thread%';
thread_stack = 512k

#每个需要排序的线程分配该大小的一个缓冲区。增加该值可以加速ORDER BY或GROUP BY操作。它是一个connection级的参数,在每个connection(session)第一次需要使用,这个buffer的时候,一次性分配设置的内存。数值也不是越大越好,由于是conection级参数过大的设置+高并发可能会好近系统内存资源,例如500个链接将会消耗 500*sort_buffer_size(2M)=1G
sort_buffer_size = 2M
#用于表关联缓存,和sort_buffer_size一样,该参数对应的分配内存也是每个链接独享。调大后可以避免多次的内表扫描,从而提高性能。也就是说,当mysql的join有使用缓存块嵌套循环连接(Block Nested-Loop Join),调大他的变量才会优化语句速度(有意义),其他时候这个变量毫无意义。默认值是256k,对于稍复杂的sql显然不够用。这个内存是回话级别分配,如果设置不好容易导致因无法分配内存而导致宕机问题。
join_buffer_size=2M



#线程池缓存大小, 当客户端断开连接后 将当前线程缓存起来 当在接到新的连接请求时快速响应 无需创建新的线程.当 Threads_cached 越来越少 但 Threads_connected 始终不降 且 Threads_created 持续升高
这时可适当增加 thread_cache_size 的大小
#show global status like 'Threads_%'
#Threads_cached    : 当前线程池中缓存有多少空闲线程
#Threads_connected : 当前的连接数 ( 也就是线程数 )
#Threads_created   : 已经创建的线程总数
#Threads_running   : 当前激活的线程数 ( Threads_connected 中的线程有些可能处于休眠状态 )
thread_cache_size = 256

#关闭一个交互链接之前所需要等待的秒数,它类似跳板机,过了多久没操作就会踢掉你,需要重新连接
interactive_timeout = 600
#关闭一个非交互链接之前所需要等待的秒数,如果有事务or存储过程需要,这个值可以调大一些
wait_timeout = 600
#默认值都是28800,可随实际情况进行调优,配置这两个参数可以减轻内存的压力。长连接的应用,为了不去反复的回收和分配资源,降低额外的开销。一般我们会将wait_timeout设定比较小,interactive_timeout要和应用开发人员沟通长链接的应用是否很多。如果他需要长链接,那么这个值可以不需要调整。动态查询如下:
#select @@interactive_timeout;
#select @@wait_timeout;
#show processlist,如果经常发现MYSQL中有大量的Sleep进程,则需要修改wait-timeout值了,不过已实际为准。

#mysql允许的最大进程连接数 数据库经常出现“Too Many COnnection”错误提示,则需要增大数值
max_connections = 6000
#mysql 用户的最大链接数量,剩余链接数用于DBA管理
max_user_connections = 5800
# mysql能够暂存的链接数量,如果mysql的链接达到max_connection时,新的请求将会被存在堆栈中,等待某一链接释放资源,该堆栈数量即back_log,如果等待连接的数量唱过back_log将会被拒绝
back_log = 1024

#默认存储引擎
default-storage-engine=InnoDB

#临时表的内存缓存大小
tmp_table_size = 32M
#临时表的最大值,每个线程都要分配。(实际起限制作用的是tmp_table_size和max_heap_table_size的最小值)如果每个内存临时表超出了限制,mysql就会自动地把它转化为基于磁盘的MYISAM表存储在指定的tmpdir目录下 ,默认目录 /tmp/  动态查目录: show variables like "tmpdir"
max_heap_table_size = 512M
#优化查询语句的时候,要避免使用临时表,如果实在避免不了的话,要保证这些临时表是存在内存中的。如果需要的话并且你有很多group by语句,并且你有很多内存,增大tmp_table_size(和max_heap_table_size)的值。这个变量不适用与用户创建的内存表(memory table).
#你可以比较内部基于磁盘的临时表的总数和创建在内存中的临时表的总数(Created_tmp_disk_tables和Created_tmp_tables),一般的比例关系是:
#Created_tmp_disk_tables/Created_tmp_tables<5%
#max_heap_table_size
#这个变量定义了用户可以创建的内存表(memory table)的大小.这个值用来计算内存表的最大行数值。这个变量支持动态改变,即set @max_heap_table_size=#  ,但是对于已经存在的内存表就没有什么用了,除非这个表被重新创建(create table)或者修改(alter table)或者truncate table。服务重启也会设置已经存在的内存表为全局max_heap_table_size的值。
#这个变量和tmp_table_size一起限制了内部内存表的大小。





#log settings
log_error = /var/log/mysql/mysql-error.log
#显示日志中的时间参数
log_timestamps = SYSTEM





#密码加密方式
default_authentication_plugin = cahing_sha2_password
#服务能处理的请求包最大大小如果过小可能会出现“信息包过大”错误
max_allowed_packet = 512M
#设置最大包,限制server接受的数据包大小,避免出现超长sql的执行问题,默认值16M
slave_max_allowed_packet = 512M


#打开的文件描述符限制,控制mysqld进程能使用的最大文件描述(FD)数量,最小值1024
open_files_limit = 65536


#配置时区
default-time_zone = '+8:00'   


#通用查询日志是否开启 默认关闭 OFF关闭 ON开启
general_log=OFF
#查询日志地址
general_log_file=/var/log/mysql/query/mysql_general.log



#开启二进制日志 正常情况必须开启 ON开启 OFF关闭
log-bin=ON
#binlog的日志存放地址
log_bin_basename=/var/log/mysql/binlog/binlog
# mysql binlog日志文件保存的过期时间,过期后自动删除 一般不启用,主从中更加不能启用
#expire_logs_days = 5
#用于标识数据库实例,防止在链试主从,多主多从的拓扑中导致sql语句的无线循环 具有唯一性
server_id = 1
#二进制文件大小
binlog_expire_logs_seconds = 604800
#事务级别的参数,指定存储整个事务生成的binlog event的内存大小,对于大事务来讲很可能会超过这个参数的设置,则需要开启binlog临时文件用于存储 1048576
binlog_cache_size=10480
#二进制非事务语句的缓存大小
binlog_stmt_cache_size=1024
#Mysql二进制日志缓存参数:
#binlog_cache_size     //事务缓存大小
#binlog_cahce_use      //事务缓存使用次数
#binblog_cache_disk_use  //事务缓存磁盘使用次数(内存缓存设置过小不够用时)
#binlog_stmt_cache_size     //非事务语句缓存大小
#binlog_stmt_cache_use    //非事务语句缓存使用次数
#binlog_stmt_cache_disk_use  //非事务语句磁盘缓存使用次数
#MySQL 的二进制日志(binary log)同步到磁盘的频率(刷新二进制日志到磁盘),默认是0,意味着mysql并不刷新,由操作系统自己决定什么时候刷新缓存到持久化设置,如果这个值比0大,它指定了两次刷新到磁盘的动作之间间隔多少次二进制日志写操作。


sync_binlog=100
#sync_binlog=0,当事务提交之后,MySQL不做fsync之类的磁盘同步指令刷新binlog_cache中的信息到磁盘,而让Filesystem自行决定什么时候来做同步,或者cache满了之后才同步到磁盘。这个是性能最好的。
#sync_binlog=1,当每进行1次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。
#sync_binlog=n,当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将inlog_cache中的数据强制写入磁盘。
#如果没有设置它为1,那么崩溃后可能导致二进制日志没有同步事务数据,有可能binlog中最后的语句丢失。要想防止这种情况,你可以使用sync_binlog全局变量(1是最安全的值,但也是最慢的),使binlog在每N次binlog写入后与硬盘 同步。即使sync_binlog设置为1,出现崩溃时,也有可能表内容和binlog内容之间存在不一致性。如果使用InnoDB表,MySQL服务器 处理COMMIT语句,它将整个事务写入binlog并将事务提交到InnoDB中。如果在两次操作之间出现崩溃,重启时,事务被InnoDB回滚,但仍 然存在binlog中。可以用--innodb-safe-binlog选项来增加InnoDB表内容和binlog之间的一致性。(注释:在MySQL 5.1中不需要--innodb-safe-binlog;由于引入了XA事务支持,该选项作废了),该选项可以提供更大程度的安全,使每个事务的 binlog(sync_binlog =1)和(默认情况为真)InnoDB日志与硬盘同步,该选项的效果是崩溃后重启时,在滚回事务后,MySQL服务器从binlog剪切回滚的 InnoDB事务。这样可以确保binlog反馈InnoDB表的确切数据等,并使从服务器保持与主服务器保持同步(不接收 回滚的语句)。
#注:大多数情况下,对数据的一致性并没有很严格的要求,所以并不会把 sync_binlog 配置成 1. 为了追求高并发,提升性能,可以设置为 100 或直接用 0。而和 innodb_flush_log_at_trx_commit 一样,对于支付服务这样的应用,还是比较推荐 sync_binlog = 1.





#二进制启用后,变量则启用,控制是否可以信任存储函数创建者,不会创建写入二进制日志引起不安全时间的存储函数,默认值为0,用户不得创建或修改存储函数,除非create routine 或 alter routinet特权之外的super权限,设置为0还强制使用delerministic特性或reads sql data 或 no sql 特性声明函数限制,如果变量为1,则不会对创建存储函数实施这些限制。变量也适用于触发器的创建
log_bin_trust_function_creators = 1

#开启慢查询日志
show_query_log=ON
#慢查询日志文件存放地址
show_query_log_file = /var/log/mysql/mysql_show_query.log
#慢查询数据库时间为5秒
show_query_time = 5
# 检索的行数必须达到此值才可被记为慢查询
#min_examined_row_limit = 100
#控制未使用索引的查询是否写入慢查询日志 ON 开启 OFF关闭 ,启用不以为不适用索引,使用完整索引扫描的查询使用索引但会诶记录,因为索引不会限制行数
log_queries_not_using_indexes=ON
#set long_query_time=1; 动态设置慢查询时间1秒
#set global slow_query_log=on; #动态开启慢查询日志
#show global status like 'slow_queries'; #显示慢查询次数
#show variables like 'long_query_time'; #显示慢查询时间
#show variables like 'show_query_log';  #显示慢查询日志是否开启
#show variables like '%query%';  #显示慢查询日志信息



# 作为从库时生效,从库复制中如何有慢sql也将被记录
#log_slow_slave_statements = 1
#主从主库配置
#server-id = 1
#log-bin=mysql-bin
#binlog-ignore-db = mysql,information_schema #忽略写入binlog日志的库
#log-slave-updates = 1 #从库的写操作记录到
#bin-logexpire_logs_days = 30 #日志存在的天数,30天
#auto-increment-increment = 2 #字段变化增量值
#auto-increment-offset = 1 #初始字段ID为1,从库为2
#slave-skip-errors = all    #跳过所有主从复制中,报错的语句

#主从从库配置
#[mysqld]
#server-id = 2
#log-bin=mysql-bin
#binlog-ignore-db = mysql,information_schema
#log-slave-updates = 1 
#expire_logs_days = 30 
#auto-increment-increment = 2
#auto-increment-offset = 2
#slave-skip-errors = all








#skip-name-resolve
#禁止 MySQL 对外部连接进行 DNS 解析,使用这一选项可以消除 MySQL 进行 DNS 解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用 IP 地址方式,否则 MySQL 将无法正常处理连接请求!



# Custom config should go here 调用/ect/mysql/conf.d下的配置文件
!includedir /etc/mysql/conf.d/

配置my.cnf文件


vim /usr/local/src/docker/mysql/config/my.cnf

#进入之后先用 :set paste  防止粘贴注释时注释给所有信息添加注释。

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL

#管理多因素身份认证功能
authentication_policy=caching_sha2_password



#server级别字符集,服务器安装时指定的默认编码格式,不要人为定义,让系统自己定义
character-set-server = utf8mb4
#设置字段编码
collation-server = utf8mb4_general_ci
#设置初始化连接编码SET NAMES utf8mb4
init_connect='SET NAMES utf8mb4'


#不区分数据大小写
lower_case_table_names = 1
#innodb使用后台线程处理数据页的读取IO(输入输出请求),根据cpu核数来更改默认是4
innodb_read_io_threads = 4
#数据库落盘脏页个数
innodb_io_capacity = 400

#定义innodb存储引擎的表数据和索引数据的最大内存缓冲区,看机器内存情况定
innodb_buffer_pool_size = 2G
#每个日志文件的大小,综合大小到缓冲池大小的5%~100%,避免日志覆写上不必要的缓冲池刷新行为。注意一个大的日志文件大小会增加恢复进程所需要的时间
innodb_log_file_size = 128M
#独立表空间模式,每个数据库的没表表都会生成一个数据空间
innodb_file_per_table = 1


#设置innodb线程的并发数
innodb_thread_concurrency=4

#innodb存储引擎下 Buffer Pool缓存大小,一般为物理内存的60%-70%存的60%-70%
innodb_buffer_pool_size=2G

#innodb存储引擎下,行锁锁定时间
innodb_lock_wait_timeout=10

#每次事务提交的时候会把log buffer刷到文件系统中去,但并不会立即刷写到磁盘。如果只是MySQL数据库挂掉了,由于文件系统没有问题数据不会丢失,减少由事务日志引起的磁盘 I/O
innodb_flush_log_at_trx_commit = 2



#索引缓冲区大小
key_buffer_size = 512M

#禁用 local-infile选项
local-infile = on

#指定链接空闲多长时间断开
lock_wait_timeout = 3600


#链接十次数据库服务不正常,会锁住IP安全设置
max_connect_errors = 10


#表描述符的缓存大小
table_open_cache = 20000

#数据字典缓存中打开的表数量软限制
table_definition_cache = 2000

#每个线程的内存大小
thread_stack = 512k


#每个需要排序的线程分配该大小的一个缓冲空间。增加该值可以加速ORDER BY或GROUP BY操作。不宜过大,占内存
sort_buffer_size = 2M

#用于表关联缓存空间(缓存块嵌套循环连接) 可以避免多次的内表扫描,从而提高性能
join_buffer_size=2M



#线程池缓存大小
thread_cache_size = 256

#关闭一个交互链接之前所需要等待的时间秒
interactive_timeout = 600
#关闭一个非交互链接之前所需要等待的时间秒
wait_timeout = 600

#最大进程连接数
max_connections = 6000
#用户的最大链接数量,剩余链接数用于DBA管理
max_user_connections = 5800
# 暂存的等待的链接数量
back_log = 1024

#默认存储引擎 5.5以上默认就是InnoDB
default-storage-engine=InnoDB

#临时表的内存缓存大小
tmp_table_size = 32M

#临时表的最大值
max_heap_table_size = 512M



#log settings 错误日志存放地址
#log_error = /var/log/mysql/error/mysql-error.log
#通用查询日志是否开启 默认关闭 OFF关闭 ON开启
#general_log=OFF
#查询日志地址
#general_log_file = /var/log/mysql/query/mysql_general.log




#开启二进制日志 正常情况必须开启 ON开启 OFF关闭
log-bin=ON
#binlog的日志存放地址
#log_bin_basename=/var/log/mysql/binlog/binlog
# mysql binlog日志文件保存的过期时间,过期后自动删除 一般不启用,主从中更加不能启用
#expire_logs_days = 5

#显示日志中的时间参数
log_timestamps = SYSTEM

#配置时区
default-time_zone = '+8:00'   

#密码加密方式
default_authentication_plugin = cahing_sha2_password

#服务能处理的请求包最大大小
max_allowed_packet = 512M

#设置最大包,限制server接受的数据包大小
slave_max_allowed_packet = 512M

#打开的文件描述符限制
open_files_limit = 65536



#标识数据库
server_id = 1
#二进制文件大小
binlog_expire_logs_seconds = 604800

#存储整个事务生成的binlog event的内存大小
binlog_cache_size=10480
#二进制非事务语句的缓存大小
binlog_stmt_cache_size=1024

#sync_binlog:是MySQL 的二进制日志(binary log)同步到磁盘的频率。当每进行1次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。保证数据不丢失。
sync_binlog = 1


#二进制启用后,变量则启用,控制是否可以信任存储函数创建者,1 不会对创建存储函数实施做控制
log_bin_trust_function_creators = 1


# 检索的行数必须达到此值才可被记为慢查询
#min_examined_row_limit = 100

# 作为从库时生效,从库复制中如何有慢sql也将被记录
#log_slow_slave_statements = 1


# Custom config should go here 调用/ect/mysql/conf.d下的配置文件
!includedir /etc/mysql/conf.d/

五、重新运行mysql8

#删除之前运行的mysql8容器
docker rm -f mysql8
#运行mysql8容器并关联本地文件
docker run \
-p 3306:3306 \
--name mysql8 \
-e MYSQL_ROOT_PASSWORD=123456 \
-e TZ=Asia/Shanghai \
-v /usr/local/src/docker/mysql/config:/etc/mysql \
-v /usr/local/src/docker/mysql/data:/var/lib/mysql \
-v /usr/local/src/docker/mysql/logs:/var/log/mysql \
--privileged=true \
--restart=always \
-d mysql:8.0 \
--lower_case_table_names=1

docker run \
-p 3306:3306 \                                        #端口号
--name mysql8 \                                       #容器名称
-e MYSQL_ROOT_PASSWORD=123456 \                       #root密码
-e TZ=Asia/Shanghai \                                 #容器时区
-v /usr/local/src/docker/mysql/config:/etc/mysql \    #mysql配置文件引用
-v /usr/local/src/docker/mysql/data:/var/lib/mysql \  #mysql数据存储引用
-v /usr/local/src/docker/mysql/logs:/var/log/mysql \  #mysql日志引用
--privileged=true \                                   #赋予这个容器和主机一样的权限
--restart=always \                                    #开机启动容器
-d mysql:8.0 \                                        #调用的镜像
--lower_case_table_names=1                            #mysql表名称不区分大小写,必须放最后
#区分大小写是对数据库进行操作,不放最后会导致报错,容器命令无法识别

六、配置数据库外部访问

#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

#进入mysql8容器
docker exec -it mysql8 /bin/bash
进入mysql数据库
mysql -u root -p
123456

#进入mysql数据库下
use mysql;
#查看用户信息 看root的host是不是% 所有地址都可以访问,如果不是则需要改一下
select host,user from user;
#修改host
update user set host='%' where user='root';
#刷新mysql配置
flush privileges;
#修改root权限开启外部访问
#alter user root@'%' identified with mysql_native_password by '密码';
alter user root@'%' identified with mysql_native_password by '123456';
#刷新mysql配置
flush privileges;

七、开启慢查询日志

#进入mysql里面进行配置
#查看慢查询配置信息
show global variables like '%query%';
#slow_query_log   控制开启关闭(OFF关闭,ON开启)
#slow_query_log_file 慢查询日志存放地址
#long_query_time 执行多长时间的sql算是慢查询  单位秒
#配置sql执行5秒以上时间算是慢查询
set global long_query_time=5;
#控制未使用索引的查询是否写入慢查询日志 ON 开启 OFF关闭 ,启用不以为不适用索引,使用完整索引扫描的查询使用索引但会诶记录,因为索引不会限制行数
set global log_queries_not_using_indexes=on;
#开启慢查询日志
set global slow_query_log='ON';
#开启之后如果有sql执行超过五秒的都会存放在 /var/lib/mysql/慢查询文件.log下

#慢查询日志的存储格式
# Time: 231009 10:59:03			执行时间
# User@Host: root[root] @ localhost [127.0.0.1] 执行SQL的主机信息
# Query_time: 19.242655  Lock_time: 0.000000 Rows_sent: 11  Rows_examined: 3761986	
#执行的信息  执行时间 发送行数 扫描行数 ↑

八、开启查询语句日志记录

#查看查询日志信息 是否开启 和日志地址
show variables like '%general%';
#开启查询日志记录 OFF关闭  ON开启
set global general_log='ON';
#修改存储地址 文件需要有mysql权限   可以不修改直接查这个文件
set global general_log_file='/var/lib/mysql/general_log.log'

  • 11
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Docker安装MySQL 8.0,可以按照以下步骤进行操作: 1. 首先,从Docker仓库中拉取MySQL 8.0的镜像。你可以使用以下命令来拉取镜像:`docker pull mysql:8.0`。 2. 检查是否成功拉取了MySQL 8.0的镜像。你可以使用以下命令来查看已经拉取的镜像:`docker images mysql:8.0`。 3. 一旦镜像拉取成功,你可以使用以下命令来创建并运行一个MySQL容器:`docker run --name mysql8.0 -e MYSQL_ROOT_PASSWORD=<password> -d mysql:8.0`。这个命令会创建一个名为mysql8.0容器,并设置一个root密码来保护你的数据库。你需要将`<password>`替换为你想要设置的实际密码。 4. 接下来,你可以使用以下命令来登录到MySQL 8.0的容器中:`docker exec -it mysql8.0 bash`。 现在,你已经成功安装MySQL 8.0并登录到了容器中。你可以使用标准的MySQL命令来管理和操作你的数据库了。记得在退出容器前,使用`exit`命令退出MySQL容器的bash终端。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Docker安装MySQL8.0](https://blog.csdn.net/m0_72157951/article/details/127822670)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值