<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>运维派</title><link>https://ywpie.com/</link><description>专注运维与数据库技术分享</description><item><title>Redis教程（4）数据持久化配置</title><link>https://ywpie.com/post/79.html</link><description>&lt;h2 style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; font-variant-emoji: normal; widows: 1; line-height: 25px; background-color: #FFFFFF; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong&gt;一、Redis的持久化介绍&lt;/strong&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;span style=&quot;font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; font-variant-emoji: normal; widows: 1; line-height: 25px; background-color: #FFFFFF;&quot;&gt;Redis支持将缓存数据持久化到硬盘中保存，避免内存中的数据在服务重启后或者服务器断电等情况下发生丢失。&lt;/span&gt;&lt;span style=&quot;line-height: 25px;&quot;&gt;Redis的数据持久化支持&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; line-height: 25px; background-color: #FFFFFF;&quot;&gt;rdb快照持久化和aof日志持久化两种方式。&lt;span style=&quot;widows: 1; background-color: #FFFFFF;&quot;&gt;在生产环境中如果要考虑Redis数据持久化，建议将两种方式都同时配置，并且是在从库上执行数据的持久化，减少对主库性能的影响&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong style=&quot;font-family: &amp;quot;&amp;quot;; widows: 1;&quot;&gt;· RDB快照持久化&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;span style=&quot;widows: 1;&quot;&gt;每隔一段时间或者操作次数达到一定量后，从内存Dump数据形成rdb文件，RDB文件是经过压缩的二进制数据，文件会比较小，恢复速度快。RDB持久化的缺点是如果当前写入的数据还无法触发持久化操作，此时发生宕机，那么会丢失这部分数据&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;widows: 1; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;· AOF日志持久化&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;widows: 1; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;类似MySQL的Binlog，可以实现每次操作的持久化，数据最为安全，但是影响性能&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;h2 style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; font-variant-emoji: normal; widows: 1; line-height: 25px; background-color: #FFFFFF; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;&lt;strong&gt;二、手动保存Redis数据&lt;/strong&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; font-variant-emoji: normal; widows: 1; line-height: 25px; background-color: #FFFFFF; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;在配置RDB和AOF前还需要了解下保存Redis数据的命令——save和bgsave，在生产环境中建议使用bgsave进行保存数据，它会fork出一个子进程来读取内存中的数据并写入到文件中，除了fork期间会有短暂的阻塞，后续的操作都不会阻塞客户端的读写请求。但是由于fork出来了新进程，在保存数据的时候内存的消耗也会double，要小心OOM风险&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; font-variant-emoji: normal; widows: 1; line-height: 25px; background-color: #FFFFFF; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://ywpie.com/zb_users/upload/2026/04/202604011775031549797604.png&quot; title=&quot;redis_permanent1.png&quot; alt=&quot;redis_permanent1.png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2 style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; font-variant-emoji: normal; widows: 1; line-height: 25px; background-color: #FFFFFF; font-size: 16px; font-family: &amp;quot;color:#000000;&amp;quot;;&quot;&gt;&lt;strong&gt;三、RDB持久化配置方法&lt;/strong&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; font-variant-emoji: normal; widows: 1; line-height: 25px; background-color: #FFFFFF; font-size: 16px; font-family: &amp;quot;color:#000000;&amp;quot;;&quot;&gt;编辑redis.conf配置文件，主要修改以下内容&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;save&amp;nbsp;900&amp;nbsp;1&amp;nbsp;&amp;nbsp;#在900秒内，key值发生变化次数超过1次则进行持久化，生产环境通常默认这个值即可&amp;nbsp;
save&amp;nbsp;300&amp;nbsp;10&amp;nbsp;&amp;nbsp;#在300秒内，key值发生变化次数超过10次则进行持久化，生产环境通常默认这个值即可&amp;nbsp;
save&amp;nbsp;60&amp;nbsp;10000&amp;nbsp;&amp;nbsp;#在60秒内，key值发生变化次数超过10000次则进行持久化，生产环境通常默认这个值即可&amp;nbsp;&amp;nbsp;
stop-write-on-bgsave-error&amp;nbsp;yes&amp;nbsp;&amp;nbsp;#&amp;nbsp;如果rdb文件在导出过程中出错则让Redis停止任何写数据请求，避免数据不一致&amp;nbsp;
rdbcompression&amp;nbsp;yes&amp;nbsp;&amp;nbsp;#压缩rdb数据，消耗CPU性能来节约磁盘空间&amp;nbsp;
rdbchecksum&amp;nbsp;yes&amp;nbsp;&amp;nbsp;#服务启动时检查rdb文件的完整性，如果不完整则不启动
dbfilename&amp;nbsp;dump.rdb&amp;nbsp;&amp;nbsp;#rdb文件名
dir&amp;nbsp;/data/redis/rdb/&amp;nbsp;#rdb文件保存路径，启动时会从该目录寻找rdb文件&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; font-variant-emoji: normal; widows: 1; line-height: 25px; background-color: #FFFFFF; font-size: 16px; font-family: &amp;quot;color:#000000;&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;color:#000000;&amp;quot;;&quot;&gt;当设置完后重启Redis服务，然后在工作中&lt;/span&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;只要达到了save条件，key就会被保存。并且日志中也会有“xx changes in xx seconds. Saving”这样的记录。&lt;span style=&quot;background-color: #FFE500;&quot;&gt;如果要关闭rdb功能的话将save选项改为save &amp;quot;&amp;quot;，引号里为空即可&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;Microsoft YaHei&amp;quot;; background-color: #FFE500;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2 style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;color:#000000;&amp;quot;;&quot;&gt;&lt;strong&gt;四、AOF持久化配置方法&lt;/strong&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;color:#000000;&amp;quot;;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;color:#000000;&amp;quot;; font-size: 16px; widows: 1; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;编辑redis.conf配置文件，主要修改以下内容&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;appendonly&amp;nbsp;yes&amp;nbsp;&amp;nbsp;#打开aof功能
#appendfsync&amp;nbsp;&amp;nbsp;no&amp;nbsp;&amp;nbsp;#让系统决定持久化时机，Linux默认30秒写入一次数据到磁盘
#appendfsync&amp;nbsp;always&amp;nbsp;&amp;nbsp;#每个命令都写入磁盘，最多丢失一条命令的数据
appendfsync&amp;nbsp;&amp;nbsp;everysec&amp;nbsp;&amp;nbsp;#每秒写一次数据到磁盘，最多丢失一秒数据，满足大部分应用场景，推荐使用
no-appendfsync-on-rewrite&amp;nbsp;&amp;nbsp;yes&amp;nbsp;&amp;nbsp;#如果正在导出rdb数据，停止aof的写入（aof将保存在一个队列中，rdb备份完成后执行队列，不会丢失数据）
auto-aof-rewrite-percentage&amp;nbsp;100&amp;nbsp;&amp;nbsp;#aof文件体积与上次相比增长率达到100%就进行重写（重写相当于记总账，比如对同一个key做了100次操作，我们只需要最后一次的操作，重写就会把多余的操作给忽略掉）
auto-aof-rewrite-min-size&amp;nbsp;64m&amp;nbsp;&amp;nbsp;#和上一项组合使用，aof文件达到64M时进行重写（重写会节省掉空间，因为多余的操作被删除了）
appendfilename&amp;nbsp;&amp;nbsp;&amp;quot;appendonly.aof&amp;quot;&amp;nbsp;&amp;nbsp;#aof文件名
dir&amp;nbsp;/data/redis6379&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;color:#000000;&amp;quot;;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;color:#000000;&amp;quot;; font-size: 16px; widows: 1; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;当Redis服务启动后需要进行数据恢复时，如果同时开启了rdb和aof持久化，Redis只会加载aof文件（因为aof即时性高于rdb），如果rdb有数据时，再开启aof选项会把已经存储过的数据清空&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://ywpie.com/zb_users/upload/2026/04/202604011775031559197690.png&quot; title=&quot;redis_permanent2.png&quot; alt=&quot;redis_permanent2.png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;当AOF写入文件时如果服务器崩溃或AOF存储已满的情况下，最后一条命令可能会被截断并产生异常的AOF文件。在AOF文件异常的情况下，如果Redis配置文件中指定了aof-load-truncated为yes，那么Redis在启动时会忽略最后一条命令并顺利启动 Redis，否则启动会失败。而如果AOF文件中间命令被破坏的话则需要使用redis-check-aof命令跳转到出现问题的命令行然后尝试手动修复此文件。如果无法手动修复，可以使用redis-check-aof --fix 自动修复AOF 异常文件，不过可能会导致异常部分至文件末尾的数据全部被丢弃。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 01 Apr 2026 16:11:01 +0800</pubDate></item><item><title>Redis教程（3）使用info命令分析Redis服务状态</title><link>https://ywpie.com/post/78.html</link><description>&lt;h2 style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;strong&gt;一、Redis info命令介绍&lt;/strong&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;Redis 内置了info命令用于查看服务状态，该命令包含了Redis主要性能指标，&lt;span style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;; font-size: 16px; text-wrap-mode: wrap;&quot;&gt;支持全局信息和指定模块信息的查看。该命令是进行&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;Redis性能分析和问题排查的关键工具&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;redis&amp;nbsp;&amp;gt;&amp;nbsp;info&amp;nbsp;&amp;nbsp;#查看所有模块信息
redis&amp;nbsp;&amp;gt;&amp;nbsp;info&amp;nbsp;keyspace&amp;nbsp;&amp;nbsp;#查看keyspace模块的信息&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://ywpie.com/zb_users/upload/2026/04/202604011775029562732001.png&quot; title=&quot;redis_info1.png&quot; alt=&quot;redis_info1.png&quot;/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;strong&gt;&lt;br/&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2 style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;strong&gt;二、&lt;/strong&gt;&lt;/span&gt;&lt;strong style=&quot;font-size: 16px;&quot;&gt;Redis info命令执行结果说明&lt;/strong&gt;&lt;/h2&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;Server&amp;nbsp;服务端信息
redis_version:3.2.12&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#redis版本号
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:de5f1daa3afe8b6a
redis_mode:standalone
os:Linux&amp;nbsp;3.10.0-862.el7.x86_64&amp;nbsp;x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.8.5
process_id:42421
run_id:3bfe4f5404c9259beee035f89bb57dc0f1708d5b
tcp_port:6379&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#redis监听端口
uptime_in_seconds:76959&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#redis服务运行了多少秒
uptime_in_days:0
hz:10
lru_clock:9055374
executable:/usr/local/redis/redis-server&amp;nbsp;&amp;nbsp;&amp;nbsp;#执行的启动脚本
config_file:/usr/local/redis/redis.conf&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#配置文件路径

#&amp;nbsp;Clients&amp;nbsp;&amp;nbsp;客户端信息
connected_clients:1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#有几个客户端连接
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#因为BLPOP、BRPOP、BRPOPLPUSH命令被阻塞的客户端

#&amp;nbsp;Memory&amp;nbsp;&amp;nbsp;内存使用情况
used_memory:1947112
used_memory_human:1.86M&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#Redis为了保存数据实际申请使用的空间，不包含碎片占用的内存
used_memory_rss:2211840
used_memory_rss_human:2.11M&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#操作系统实际分配给&amp;nbsp;Redis&amp;nbsp;的物理内存空间，里面就包含了碎片
used_memory_peak:1947112
used_memory_peak_human:1.86M
total_system_memory:1021906944
total_system_memory_human:974.57M
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:1.14&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#内存碎片化，如果碎片化的值达到了2，最好重启redis服务，计算方式是实际内存除以理论内存
mem_allocator:libc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#redis使用的内存分配器，新版本中使用的是jemalloc，碎片化更少

#&amp;nbsp;Persistence&amp;nbsp;&amp;nbsp;持久化存储信息
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1535705992
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
aof_enabled:0&amp;nbsp;&amp;nbsp;#0代表没有开启
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok

#&amp;nbsp;Stats&amp;nbsp;&amp;nbsp;状态信息
total_connections_received:6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#redis从启动到现在接受到的连接总数
total_commands_processed:76141&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#redis从启动到现在接受到的命令总数，当客户端响应过慢时可通过监控每秒命令执行数来判断服务是否响应延迟
instantaneous_ops_per_sec:1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#每秒执行命令数
total_net_input_bytes:2890573&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#入站流量
total_net_output_bytes:113930&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#出站流量
instantaneous_input_kbps:0.05
instantaneous_output_kbps:0.00
rejected_connections:0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#由于达到maxclient的限制而被拒绝的客户端数
sync_full:1
sync_partial_ok:0
sync_partial_err:0
expired_keys:0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#过期的key数量
evicted_keys:0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#因为达到max_memory而被淘汰的key数量
keyspace_hits:0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#缓存命中数
keyspace_misses:0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#缓存未命中数，结合缓存命中数可以算出命中率
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:615
migrate_cached_sockets:0

#&amp;nbsp;Replication&amp;nbsp;主从信息
role:master&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#当前节点的角色，master是主，slave是从
connected_slaves:1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#有几个从节点
slave0:ip=192.168.145.69,port=6379,state=online,offset=106797,lag=0&amp;nbsp;&amp;nbsp;#从节点的信息
master_repl_offset:106797&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#主库接收写命令的进度信息，可以计算主从复制差值，配合监控进行告警，让业务代码不走延迟过多的从库
slave_repl_offset：105121&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#从库复制写命令的进度信息，可以计算主从复制差值，配合监控进行告警，让业务代码不走延迟过多的从库
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:106796

#&amp;nbsp;CPU
used_cpu_sys:94.37
used_cpu_user:41.88
used_cpu_sys_children:0.01
used_cpu_user_children:0.00

#&amp;nbsp;Cluster&amp;nbsp;集群信息
cluster_enabled:0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#0代表没有开启集群

#&amp;nbsp;Keyspace
db3:keys=2,expires=2,avg_ttl=99950282&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#db3中有2个key，有2个key设置了过期时间，平均过期时间是99950282秒（0为不过期）&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;strong style=&quot;font-size: 16px;&quot;&gt;&lt;/strong&gt;&lt;br/&gt;&lt;/p&gt;&lt;h2 style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong&gt;三、Redis info命令主要关注信息&lt;/strong&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h3 style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;1、memory模块&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;该模块输出了内存相关信息，可用于分析内存与碎片问题，比如Redis占用了多少内存、最大可用内存以及内存碎片率等信息&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px; background-color: #FFFF00;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;background-color:#FFE500;&amp;quot;;&quot;&gt;· used_memory_human&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;background-color:#FFE500;&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/strong&gt;：把Redis使用的内存总量进行了统计，包含了实际缓存占用的内存和Redis自身运行所占用的内存(如元数据、lua)，但是不包含内存碎片&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px; background-color: #FFFF00;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;background-color:#FFE500;&amp;quot;;&quot;&gt;·&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;background-color:#FFE500;&amp;quot;; background-color: #FFFF00;&quot;&gt;used_memory_rss_human&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;：这一项在上一项的基础上包含了内存碎片的统计。&lt;span style=&quot;background-color: #FFFFFF; font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;如果该值的统计数据大于了maxmemory所设置的值，说明Redis当前有使用swap虚拟内存，效率必然很低&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;。为了避免Redis使用到swap交换内存，建议设置好Key的过期淘汰策略。&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;如果&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;key都有设置TTL过期时间，使用volatile-ttl回收策略最合适；如果没有设置过期时间，使用allkeys-lru比较合适，它会从所有key中挑选最近最少使用的key进行删除(LRU淘汰算法)。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px; background-color: #FFFF00;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;background-color:#FFE500;&amp;quot;;&quot;&gt;· mem_fragmentation_ratio&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;background-color:#FFE500;&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/strong&gt;：&amp;nbsp;内存碎片率由use_memory_rss除以user_memory所得到，内存碎片率越高，说明未回收的内存越多，意味着浪费的内存空间也就越大。通常来说&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;内存碎片率稍大于1是合理的，如果超过1.5表Redis消耗了实际需要物理内存的150%，有50%都是碎片。若是内存碎片率低于1的话，说明Redis能申请的内存已经达不到期望值，有可能是系统内存不够用了使用了SWAP分区。Redis 4之后可以使用动态碎片整理，而之前的版本中如果要清理碎片只能进行重启操作，这样会导致数据丢失（通过RDB进行数据恢复的话也有额外的时间成本）&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;。除了上面提到的方法，修改redis内存分配器也能带来一定的优化效果。Redis支持glibc、jemalloc、tcmalloc几种不同的内存分配器，每个分配器在内存分配和碎片上都有不同的实现。通常使用redis默认的jemalloc内存分配器即可。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;background-color:#FFE500;&amp;quot;;&quot;&gt;· mem_allocator&lt;/span&gt;&lt;/strong&gt;：Redis使用的内存分配器，可以是libc、jemalloc、tcmalloc。libc的性能最次。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px; background-color: #FFFF00;&quot;&gt;&lt;strong&gt;· maxmemory_human&lt;/strong&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;&lt;span style=&quot;background-color: #FFE500;&quot;&gt;&lt;/span&gt;：Redis最大可使用的内存限制。虽然used_memory_human的值会受到&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;它的限制（比如配置了maxmemory_human为2G，used_memory_human会限制在2G内），但是因为碎片问题used_memory_rss_human会突破限制。带来的直接问题就是如果maxmemory_human配置的和系统最大内存接近容易发生OOM&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;; font-size: 16px;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;background-color: #FFFFFF; font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;strong&gt;2、stats模块&lt;/strong&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;background-color: #FFFFFF; font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;strong&gt;排查复杂度过高的命令带来的慢查询问题&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;background-color: #FFFFFF; font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px; background-color: #FFFF00;&quot;&gt;&lt;strong&gt;· total_commands_processed：&lt;/strong&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;对Redis服务处理命令的数量进行统计，这是排查延迟问题的关键值，因为Redis是在单线程模型下工作，会把接收到的客户端命令按顺序执行，如果&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;font-size:16px;&amp;quot;; background-color: #FFFF00;&quot;&gt;执行命令过多或者存在很多慢命令就会让整个队列阻塞而导致延迟。&lt;/span&gt;由于total_commands_processed的值是递增的，所以要使用Zabbix做监控的话需要统计的是每秒的差值，这样才能知道每秒处理总数是上升还是下降，以便排查&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Wed, 01 Apr 2026 16:01:49 +0800</pubDate></item><item><title>Docker运维教程（2）镜像与容器管理</title><link>https://ywpie.com/post/77.html</link><description>&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;一、Docker 镜像管理&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;自从Docker分为CE版和EE版后，命令行也发生了变化。在CE版本中对命令进行了分组，并且支持命令补全，包括版本号都可以自动补全。通过docker --help命令可以看到 Management Commands 包含多个组，这些组都是被操作的对象。不同的组有不同的子命令，所以目前通常都是使用&amp;quot;docker+对象名+子命令&amp;quot;的命令格式（老版本是“docker+子命令”&lt;span style=&quot;font-size: 16px; text-wrap-mode: wrap;&quot;&gt;）&lt;/span&gt;。虽然以前的命令格式也可以继续使用，但是更推荐使用新的命令格式进行管理&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;docker&amp;nbsp;container&amp;nbsp;create&amp;nbsp;&amp;nbsp;#新格式
docker&amp;nbsp;create&amp;nbsp;&amp;nbsp;#老格式
docker&amp;nbsp;container&amp;nbsp;--help&amp;nbsp;&amp;nbsp;#查看指定组所支持的子命令&lt;/pre&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;1、查看镜像&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;使用docker images命令查看当前系统中已下载的镜像信息，包含镜像名称（REPOSITORY）、标签（TAG）、镜像ID（IMAGE_ID）、创建时间（CREATED）、镜像大小（SIZE）等&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;docker&amp;nbsp;images
REPOSITORY&amp;nbsp;&amp;nbsp;&amp;nbsp;TAG&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IMAGE&amp;nbsp;ID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CREATED&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SIZE
nginx&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;latest&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0cf1d6af5ca7&amp;nbsp;&amp;nbsp;&amp;nbsp;17&amp;nbsp;hours&amp;nbsp;ago&amp;nbsp;&amp;nbsp;&amp;nbsp;161MB&lt;/pre&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;2、搜索镜像&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;使用docker search命令可以在默认的镜像仓库中进行镜像搜索，搜索结果中没有带用户名信息的镜像通常是官方镜像&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;docker&amp;nbsp;search&amp;nbsp;nginx
#&amp;nbsp;INDEX代表了镜像来源于哪个仓库，默认是docker.io
#&amp;nbsp;NAMES：镜像名，如果名字没有用/分割代表是顶级仓库，通常是官方提供的镜像。带/的前面是用户名，后面才是镜像名，后续安装和启动都需要用到这个名字
#&amp;nbsp;DESCRIPTION：镜像的描述信息&amp;nbsp;
#&amp;nbsp;STARS：是获得的星数，也就是评分或热门程度
#&amp;nbsp;OFFICIAL：官方认证&lt;/pre&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;3、下载镜像&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;使用docker pull或docker image pull从指定的公网仓库中下载指定的Docker镜像，如果一个镜像存在多个版本，需要先到Docker Hub中确认每个版本的标签才能正确的下载&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;registry默认为dockerhub；镜像名格式是&amp;lt;用户名&amp;gt;/&amp;lt;镜像名&amp;gt;，用户名不写的话默认使用官方镜像；镜像标签默认为latest
#&amp;nbsp;docker&amp;nbsp;pull&amp;nbsp;[registry地址[:端口]/]镜像名:标签&amp;nbsp;
docker&amp;nbsp;pull&amp;nbsp;nginx&amp;nbsp;&amp;nbsp;#从dockerhub中下载官方nginx镜像
docker&amp;nbsp;pull&amp;nbsp;bitname/wordpress&amp;nbsp;&amp;nbsp;#从dockerhub下载bitname所提供的wordpress镜像
docker&amp;nbsp;pull&amp;nbsp;quay.io/coreos/flannel:v1.1&amp;nbsp;&amp;nbsp;#从quay.io这个公网仓库的coreos名称空间中下载镜像flannel镜像，标签为v1.1&lt;/pre&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;4、删除镜像&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;使用docker rmi或docker image rmi命令可以通过镜像名字或者ID来删除已下载的Docker镜像，ID可以只输入前缀，保持唯一即可&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;[root@centos1&amp;nbsp;~]#&amp;nbsp;docker&amp;nbsp;images
REPOSITORY&amp;nbsp;&amp;nbsp;&amp;nbsp;TAG&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IMAGE&amp;nbsp;ID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CREATED&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SIZE
nginx&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;latest&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0cf1d6af5ca7&amp;nbsp;&amp;nbsp;&amp;nbsp;18&amp;nbsp;hours&amp;nbsp;ago&amp;nbsp;&amp;nbsp;&amp;nbsp;161MB

[root@centos1&amp;nbsp;~]#&amp;nbsp;docker&amp;nbsp;rmi&amp;nbsp;0cf1d
Untagged:&amp;nbsp;nginx:latest
Untagged:&amp;nbsp;nginx@sha256:7150b3a39203cb5bee612ff4a9d18774f8c7caf6399d6e8985e97e28eb751c18
Deleted:&amp;nbsp;sha256:0cf1d6af5ca72e2ca196afdbdbe26d96f141bd3dc14d70210707cf89032ea217
Deleted:&amp;nbsp;sha256:61633ce66c62a864471c8b5378d9ffa3f81c766a960a3590211f3221c1ab4a59
Deleted:&amp;nbsp;sha256:41b747d79cc454963fb711facd1ece56107a1cea116f91f9f2226a8ad2f6aa7a
Deleted:&amp;nbsp;sha256:5517b4dad484d2bd81693cb01c59de8d731101babc8f4e25af94839b01cb8101
Deleted:&amp;nbsp;sha256:97ee1d7582029102147c004b04f96d5bca5bdd9142a91c2164f8d86069a430c3
Deleted:&amp;nbsp;sha256:995b22525898b5afc8b76051e02d5f4ffd7fde6aae7d2098545978c4768b73d2
Deleted:&amp;nbsp;sha256:d56d0c05af74d3308643ed2eb1c57c8a56ebe1922068720f393b30a285072b93
Deleted:&amp;nbsp;sha256:188c9b34dfbe022075d01fc4f5a305412909ef97de440783c15043e68e1b1913&lt;/pre&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;5、查看镜像构建&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;使用docker history命令可以查看镜像构建过程&lt;/span&gt;&lt;/p&gt;&lt;pre&gt;docker&amp;nbsp;histrosy&amp;nbsp;image_name&lt;/pre&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;6、镜像标签&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;使用docker tag命令实现为镜像打标签，通常在需要上传镜像到仓库中时就需要标记好镜像所属仓库地址和用户（也可以直接用 docker build -t 在创建镜像的时候就起好名字）&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;docker&amp;nbsp;tag&amp;nbsp;38baaxh26s6661&amp;nbsp;tanglu/centos:v1.1&amp;nbsp;&amp;nbsp;#给一个没有标签的镜像打上标签，这里没有写仓库地址，默认是dockerhub，完整格式是dockerhub/tanglu/centos:v1.1
docker&amp;nbsp;tag&amp;nbsp;tanglu/centos:v1.1&amp;nbsp;tanglu/centos:v1.2&amp;nbsp;&amp;nbsp;#修改标签
docker&amp;nbsp;tag&amp;nbsp;ngx-app&amp;nbsp;tanglu/ngx-app:1.0&amp;nbsp;&amp;nbsp;#将镜像ngx-app改名为tanglu/ngx-app:1.0：&lt;/pre&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;二、Docker 容器管理&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;1、&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;运行容器&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;docker run命令用于运行&lt;span style=&quot;font-size: 16px; text-wrap-mode: wrap;&quot;&gt;镜像&lt;/span&gt;成为容器，如果运行的镜像并不存在于本地则会自动去仓库拉取。该选项包含以下子选项：&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;docker run&amp;nbsp;-d：以后台方式运行容器，该选项需要配合-i、-t选项一起使用，使用该选项后exit退出容器也不影响里面运行的程序&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;docker run&amp;nbsp;-it：这里包含了i和t两个选项，代表使用交互方式打开一个容器的终端以便执行命令&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;docker run&amp;nbsp;-e：定义容器启动后的环境变量&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;docker run&amp;nbsp;--dns：自定义容器的DNS地址&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;docker run&amp;nbsp;--name：定义容器本身的名字&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;docker run&amp;nbsp;--hostname：定义容器运行后的主机名，否则会使用容器的ID作为主机名&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;docker run&amp;nbsp;--network：指定容器的网络，常用于容器跨主机通信&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;docker run&amp;nbsp;--add-host：为容器的hosts文件增加记录&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;docker run&amp;nbsp;--rename&amp;nbsp;：修改容器名字&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;docker run&amp;nbsp;--rm：当容器退出后会自动被删除掉，常用于进行容器测试或者云主机环境，需要短期且大量的Docker虚拟机工作，工作完成后自动销毁&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;docker&amp;nbsp;run&amp;nbsp;-d&amp;nbsp;-it&amp;nbsp;--rm&amp;nbsp;--name&amp;nbsp;web01&amp;nbsp;nginx&amp;nbsp;&amp;nbsp;#后台启动了一个名为web01的nginx镜像
docker&amp;nbsp;stop&amp;nbsp;web01&amp;nbsp;&amp;nbsp;#这个容器停止后就会被自动删除&lt;/pre&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;docker run&amp;nbsp;-p：将宿主机中指定的端口与Docker容器中的端口进行映射，可以实现将容器中的端口暴露到宿主机上的效果，方便宿主机访问。比如在容器中安装Nginx后需要把80端口映射到宿主机上，然后通过宿主机就可以访问到容器中的服务。使用netstat命令或者docker ps命令、docker port命令都可以查看到端口映射关系，使用iptables命令还可以看到自动创建好的转发规则&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;不写宿主机端口则是一个随机端口
docker&amp;nbsp;run&amp;nbsp;--name&amp;nbsp;test_nginx&amp;nbsp;--rm&amp;nbsp;-p&amp;nbsp;80&amp;nbsp;nginx
#&amp;nbsp;指定宿主端口
docker&amp;nbsp;run&amp;nbsp;--name&amp;nbsp;test_nginx&amp;nbsp;--rm&amp;nbsp;-p&amp;nbsp;8080:80&amp;nbsp;nginx
#宿主机端口为8000，网络接口为ALL
docker&amp;nbsp;run&amp;nbsp;--name&amp;nbsp;test_nginx&amp;nbsp;--rm&amp;nbsp;-p&amp;nbsp;8000:80&amp;nbsp;-p&amp;nbsp;3306:3306&amp;nbsp;nginx
#指定了网络接口&amp;nbsp;&amp;nbsp;
docker&amp;nbsp;run&amp;nbsp;--name&amp;nbsp;test_nginx&amp;nbsp;--rm&amp;nbsp;-p&amp;nbsp;192.168.1.100:8000:80&amp;nbsp;nginx&amp;nbsp;
docker&amp;nbsp;port&amp;nbsp;nginx&amp;nbsp;#查看nginx容器的端口映射关系&lt;/pre&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;docker run&amp;nbsp; --restart：Docker容器的自启动，使用该选项后容器会跟随宿主机的启动而自我启动。该选项默认值是no，改为yes即可&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;docker&amp;nbsp;run&amp;nbsp;-itd&amp;nbsp;--restart=yes&amp;nbsp;&amp;nbsp;-name=centos_docker1&amp;nbsp;docker.io/ansible/centos7-ansible&amp;nbsp;/bin/bash&lt;/pre&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;docker run --link：会在hosts文件中为指定的容器做一个解析记录，常用于不同容器之间的互通，免去手动配置IP&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;docker&amp;nbsp;run&amp;nbsp;-it&amp;nbsp;--link&amp;nbsp;nginx:web&amp;nbsp;nginx:lastert&amp;nbsp;/bin/bash&amp;nbsp;&amp;nbsp;#nginx为另一个容器的名字，web为这个容器的别名，ping&amp;nbsp;web这个名字可以看到nginx这个容器的IP
#nginx容器和mysql、zabbix互通
docker&amp;nbsp;run&amp;nbsp;--name&amp;nbsp;zabbix-web-nginx-mysql&amp;nbsp;-t&amp;nbsp;\
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-e&amp;nbsp;DB_SERVER_HOST=&amp;quot;mysql-server&amp;quot;&amp;nbsp;\
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-e&amp;nbsp;MYSQL_DATABASE=&amp;quot;zabbix&amp;quot;&amp;nbsp;\
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-e&amp;nbsp;MYSQL_USER=&amp;quot;zabbix&amp;quot;&amp;nbsp;\
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-e&amp;nbsp;MYSQL_PASSWORD=&amp;quot;zabbix&amp;quot;&amp;nbsp;\
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-e&amp;nbsp;MYSQL_ROOT_PASSWORD=&amp;quot;zabbix&amp;quot;&amp;nbsp;\
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--link&amp;nbsp;mysql-server:mysql&amp;nbsp;\
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--link&amp;nbsp;zabbix-server-mysql:zabbix-server&amp;nbsp;\
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-p&amp;nbsp;8080:80&amp;nbsp;\
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-d&amp;nbsp;zabbix/zabbix-web-nginx-mysql:latest&lt;/pre&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;2、查看容器运行情况&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#下面两条命令等效，用于查看系统中正在运行的容器&amp;nbsp;
docker&amp;nbsp;container&amp;nbsp;ls&amp;nbsp;-a&amp;nbsp;&amp;nbsp;#加-a可以看到已经停止的容器
docker&amp;nbsp;container&amp;nbsp;ps&amp;nbsp;-a&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;3、启动与停止&lt;span style=&quot;font-size: 16px; text-wrap-mode: wrap;&quot;&gt;容器&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;启动容器：docker container start&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;停止容器：docker container&amp;nbsp;stop&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;重启容器：docker container restart&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;强制停止容器：docker container kill&lt;/span&gt;&lt;/p&gt;&lt;pre&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;docker&amp;nbsp;container&amp;nbsp;stop&amp;nbsp;nginx&lt;br/&gt;docker&amp;nbsp;container&amp;nbsp;restart&amp;nbsp;nginx&lt;br/&gt;docker&amp;nbsp;container&amp;nbsp;kill&amp;nbsp;nginx&lt;br/&gt;docker&amp;nbsp;container&amp;nbsp;stop&amp;nbsp;`docker&amp;nbsp;container&amp;nbsp;ps&amp;nbsp;-qa`&amp;nbsp;&amp;nbsp;#批量停止容器&lt;br/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;4、暂停容器&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;有时候需要暂停容器工作一段时间，比如进行快照、暂时释放宿主机资源，暂停的容器不消耗资源&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;docker&amp;nbsp;pause&amp;nbsp;centos:v1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#暂停指定的容器
docker&amp;nbsp;unpause&amp;nbsp;centos:v1&amp;nbsp;&amp;nbsp;#恢复被暂停的指定容器&lt;/pre&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;5、查看容器元信息&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;docker container port命令可以查看容器端口的映射信息；docker container inspect命令可以查看容器更详细的底层信息，如容器运行后默认执行什么命令（cmd）、每个容器的IP信息（这就是为什么能通过宿主机访问容器中服务的原因，在安装了Docker后网卡配置里多了一个docker0的网卡，之后建立的容器都是跟该网卡在一个网段内，默认是172.段）&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;docker&amp;nbsp;container&amp;nbsp;inspect&amp;nbsp;-f&amp;nbsp;{{.NetworkSettings.IPAddress}}&amp;nbsp;nginx&amp;nbsp;&amp;nbsp;#获取nginx容器下的IP信息,可以精确到小类
docker&amp;nbsp;port&amp;nbsp;test_nginx&amp;nbsp;&amp;nbsp;#查看端口映射情况&lt;/pre&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;6、登录容器&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;使用docker container attach、docker container exec两个命令都可以进入运行中的容器，&lt;/span&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;attach是直接进入容器正在运行的命令中，不会启动新的进程。如果容器是在执行一个无限循环进行输出，那attach进入后则会看到这些输出信息。而&lt;/span&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;exec是开启一个新的终端进入容器，之后可以对容器进行各种操作，并且执行exit退出容器时不会让容器停止运行&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;7、退出容器&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;容器运行后如果要退出的话，不要使用exit命令或者Ctrl+C来退出终端，这样容器状态会成为exitd状态，里面的服务也就无法正常使用了。需要使用ctrl+p+q这样的组合键进行退出，这样可以保持容器状态是UP。如果容器已经是exitd状态，通过docker start命令启动来恢复运行&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;8、删除容器&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;如果要删除已经停止的容器则使用docker rm或者docker container rm命令，跟上镜像名称或者ID都可以删除。如容器没有停止的话是无法直接删除的，需要加上-f选项或者先停止掉容器，使用命令是docker stop或者docker kill，然后跟上ID或者镜像名称，停止后再执行删除就可以了&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;9、宿主与容器的文件复制&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;使用docker cp命令可以将文件进行互相复制&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;docker&amp;nbsp;cp&amp;nbsp;index.html&amp;nbsp;770fbbsagi:/usr/local/nginx/html/&amp;nbsp;&amp;nbsp;#复制本地文件index.html到容器/usr/local/nginx/html/中&lt;/pre&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;10、查看容器运行日志&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;使用docker logs -f可以查看容器的日志，类似于tailf命令&lt;/span&gt;&lt;/p&gt;</description><pubDate>Fri, 27 Mar 2026 10:44:54 +0800</pubDate></item><item><title>Docker运维教程（1）Docker的基本概念与安装</title><link>https://ywpie.com/post/76.html</link><description>&lt;h2&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;strong&gt;一、Docker简介&lt;/strong&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;; font-size: 16px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;Docker本身并不是容器，而是对容器进行了一种封装，是容器技术的一种简化实现方式。容器技术&lt;/span&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;; background-color: #FFFF00;&quot;&gt;可以快速将不同版本的应用或者不同应用&lt;span style=&quot;font-family: &amp;quot;background-color:#FFE500;&amp;quot;; background-color: #FFFF00;&quot;&gt;打包到容器中实现服务快速部署，减少环境不一致带来的问题，而且每个容器之间相互隔离互不影响，并且可以快速移植到其他环境中。&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; background-color: #FFFFFF;&quot;&gt;通过Docker的Logo也可以看出，它就像是一个集装箱，如果某个装水果的集装箱出了问题，也不会影响到装酒水的集装箱&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;&lt;span style=&quot;font-family: &amp;quot;background-color:#FFE500;&amp;quot;; font-size: 16px;&quot;&gt;&lt;strong&gt;二、Docker名词解释&lt;/strong&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2&gt;&lt;span style=&quot;font-family: &amp;quot;background-color:#FFE500;&amp;quot;; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;; font-size: 16px;&quot;&gt;Docker底层是Linux内核所自带的LXC技术，主要包含以下核心：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px; background-color: #FFFFFF; font-family: &amp;quot;background-color:#FFE500;&amp;quot;;&quot;&gt;· CGROUP&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; background-color: #FFFFFF;&quot;&gt;负责对&lt;span style=&quot;font-family: &amp;quot;background-color:#FFE500;&amp;quot;;&quot;&gt;Docker各&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;font-size:16px;background-color:#FFE500;&amp;quot;;&quot;&gt;容器之间资源占用进行分配管理。&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;相比传统虚拟化来说Docker容器会共享宿主机的内核资源，而且少了系统层面的开销，不需要为每个容器去虚拟化一个完整的系统，而且即使是下载一个Centos系统镜像也才200M（底层会使用宿主机的内核，也因此容器的内核是无法升级的，必须和宿主机一致）&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px; background-color: #FFFFFF;&quot;&gt;&lt;strong style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; background-color: #FFFFFF; font-family: &amp;quot;background-color:#FFE500;&amp;quot;;&quot;&gt;·&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;Namespace&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; background-color: #FFFFFF; font-family: &amp;quot;background-color:#FFE500;&amp;quot;;&quot;&gt;负责容器之间资源隔离的实现。不同的Namespace隔离的资源不同。&lt;/span&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;UTS&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;用于隔离主机名和域名，要求系统内核版本2.6；&lt;/span&gt;&lt;/span&gt;&lt;strong style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;background-color: #FFFFFF; font-family: &amp;quot;&amp;quot;;&quot;&gt;IPC&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;background-color: #FFFFFF; font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;用于隔离消息队列、共享内存、信号量，要求系统内核版本2.6；&lt;/span&gt;&lt;strong style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;background-color: #FFFFFF; font-family: &amp;quot;&amp;quot;;&quot;&gt;PID&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;background-color: #FFFFFF; font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;用于隔离进程编号，要求系统内核版本2.6；&lt;/span&gt;&lt;strong style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;background-color: #FFFFFF; font-family: &amp;quot;&amp;quot;;&quot;&gt;NETWORK&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;background-color: #FFFFFF; font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;用于隔离网络设备和端口等，要求系统内核版本2.6；&lt;/span&gt;&lt;strong style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;background-color: #FFFFFF; font-family: &amp;quot;&amp;quot;;&quot;&gt;MOUNT&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;background-color: #FFFFFF; font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;用于&lt;/span&gt;&lt;span style=&quot;background-color: #FFFFFF; font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;隔离文件系统与挂载点，要求系统内核版本2.4；&lt;/span&gt;&lt;strong style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;USER&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;用于隔离用户和用户组，&lt;span style=&quot;background-color: #FFFF00;&quot;&gt;要求系统内核版本3.8&lt;/span&gt;，&lt;span style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;这也是为什么要在Centos 7使用Docker的原因。&lt;/span&gt;需要注意的是登陆容器后看到的root通常不是真正的root，比如要用那个用户去cat /etc/passwd，那一样会报出权限错误。&lt;/span&gt;&lt;span style=&quot;background-color: #FFFFFF; font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;UTS、NET、IPC这三个名称空间通常是共享给各容器使用，这样可以更方便的实现多容器使用同端口的需求。否则需要DNAT、SNAT两次网络转换才可以&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px; background-color: #FFFFFF; font-family: &amp;quot;background-color:#FFE500;&amp;quot;;&quot;&gt;&lt;strong style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px; background-color: #FFFFFF;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;background-color:#FFE500;&amp;quot;;&quot;&gt;·&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/strong&gt;Docker镜像&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;可以理解为模板文件，也可以想象成平时装系统用的.iso文件&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;background-color:#FFE500;&amp;quot;;&quot;&gt;&lt;strong style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px; background-color: #FFFFFF;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;background-color:#FFE500;&amp;quot;;&quot;&gt;·&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/strong&gt;Docker容器&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;镜像运行之后成为docker容器，就像程序运行后变成进程&lt;br/&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;font-size:16px;background-color:#FFE500;&amp;quot;;&quot;&gt;&lt;strong style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px; background-color: #FFFFFF;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;background-color:#FFE500;&amp;quot;;&quot;&gt;·&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/strong&gt;Docker仓库&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;（registry）&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;镜像仓库，就像github一样可以存放很多做好的镜像。比如需要LAMP环境可以去公有仓库里看看有没有合适的镜像，有的话直接下载就可以使用，无需配置。也可以自建仓库，存放适合内部使用的镜像&lt;/span&gt;。&lt;span style=&quot;font-family: &amp;quot;font-size:16px;background-color:#FFFFFF;&amp;quot;;&quot;&gt;Docker采用分层构建机制，最底层为bootfs，上层为rootfs。在bootfs中包含了bootloader和kernel，它的作用就是用于引导和启动容器，在容器启动完成后就会卸掉bootfs节约内存，rootfs则是容器的根文件系统。而且不同的镜像如果使用到了相同的内容，只会存一份，节约了磁盘空间。Aufs是Docker最初使用的容器文件系统，而现在最主流的则是overlay2（已经从3.18版本开始被Linux内核合并）、devicemapper（CentOS7早期所使用）&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;&lt;strong style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;三、安装Docker&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;1、安装新版本之前清理旧版本及其依赖组件&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;yum&amp;nbsp;remove&amp;nbsp;docker&amp;nbsp;&amp;nbsp;docker-client&amp;nbsp;docker-client-latest&amp;nbsp;docker-common&amp;nbsp;docker-latest&amp;nbsp;docker-latest-logrotate&amp;nbsp;docker-logrotate&amp;nbsp;docker-engine&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;2、配置Docker的官方&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px; background-color: #FFFFFF;&quot;&gt;YUM源&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;text-wrap-style: initial;&quot;&gt;官方仓库可以通过&lt;/span&gt;&lt;span style=&quot;text-wrap-style: initial; font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;安装手册（https://docs.docker.com/engine/install/）查看，此外还有很多像阿里云、清华大学&lt;/span&gt;第三方仓库也可以安装Docker。&lt;/span&gt;Docker从V1.13之后分为了CE和EE两个分支，其中docker-ce为社区免费版，docker-ee为商业收费版&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#安装yum-utils包后可以通过yum-config-manager来快捷设置仓库地址
yum&amp;nbsp;install&amp;nbsp;-y&amp;nbsp;yum-utils&amp;nbsp;&amp;nbsp;

#配置仓库地址
yum-config-manager&amp;nbsp;--add-repo&amp;nbsp;https://download.docker.com/linux/centos/docker-ce.repo

#安装docker-ce
yum&amp;nbsp;install&amp;nbsp;docker-ce&amp;nbsp;docker-ce-cli&amp;nbsp;containerd.io&amp;nbsp;docker-buildx-plugin&amp;nbsp;docker-compose-plugin&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;3、启动Docker，&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px; text-wrap-mode: wrap;&quot;&gt;如果使用过程中提示&amp;quot;Is the docker daemon running on this host&amp;quot;都说明是服务没有启动&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;systemctl&amp;nbsp;start&amp;nbsp;docker&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;4、通过docker version和docker info命令可以查看版本和详细信息。如启动了多少个容器、默认的仓库地址、下载了多少镜像、文件系统等&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;[root@centos1&amp;nbsp;~]#&amp;nbsp;docker&amp;nbsp;version
Client:&amp;nbsp;Docker&amp;nbsp;Engine&amp;nbsp;-&amp;nbsp;Community
&amp;nbsp;Version:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;26.1.4
&amp;nbsp;API&amp;nbsp;version:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.45
&amp;nbsp;Go&amp;nbsp;version:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;go1.21.11
&amp;nbsp;Git&amp;nbsp;commit:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5650f9b
&amp;nbsp;Built:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Wed&amp;nbsp;Jun&amp;nbsp;&amp;nbsp;5&amp;nbsp;11:32:04&amp;nbsp;2024
&amp;nbsp;OS/Arch:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;linux/amd64
&amp;nbsp;Context:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;default

Server:&amp;nbsp;Docker&amp;nbsp;Engine&amp;nbsp;-&amp;nbsp;Community
&amp;nbsp;Engine:
&amp;nbsp;&amp;nbsp;Version:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;26.1.4
&amp;nbsp;&amp;nbsp;API&amp;nbsp;version:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.45&amp;nbsp;(minimum&amp;nbsp;version&amp;nbsp;1.24)
&amp;nbsp;&amp;nbsp;Go&amp;nbsp;version:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;go1.21.11
&amp;nbsp;&amp;nbsp;Git&amp;nbsp;commit:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;de5c9cf
&amp;nbsp;&amp;nbsp;Built:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Wed&amp;nbsp;Jun&amp;nbsp;&amp;nbsp;5&amp;nbsp;11:31:02&amp;nbsp;2024
&amp;nbsp;&amp;nbsp;OS/Arch:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;linux/amd64
&amp;nbsp;&amp;nbsp;Experimental:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;false
&amp;nbsp;containerd:
&amp;nbsp;&amp;nbsp;Version:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.6.33
&amp;nbsp;&amp;nbsp;GitCommit:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d2d58213f83a351ca8f528a95fbd145f5654e957
&amp;nbsp;runc:
&amp;nbsp;&amp;nbsp;Version:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.1.12
&amp;nbsp;&amp;nbsp;GitCommit:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v1.1.12-0-g51d5e94
&amp;nbsp;docker-init:
&amp;nbsp;&amp;nbsp;Version:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.19.0
&amp;nbsp;&amp;nbsp;GitCommit:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;de40ad0&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;5、由于安全问题，非root用户默认是无法执行docker相关命令的，可以通过修改用户组的方式进行授权&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;groupadd&amp;nbsp;docker
usermod&amp;nbsp;-G&amp;nbsp;docker&amp;nbsp;tanglu&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;四、Docker镜像仓库加速&lt;/span&gt;&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;Dcoker镜像仓库的作用和操作系统YUM仓库类似，只不过里面存放的是各种镜像而不是系统软件。如系统镜像、Redis镜像、MySQL镜像等。由于Docker默认使用的镜像仓库是国外的docker hub，在拉取镜像的时候会存在过慢的问题，所以建议配置镜像加速服务。配置方法也很简单，只需要在D&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;ocker服务端配置文件/etc/docker/daemon.json（该文件默认不存在，需自行创建）并自定义仓库地址即可，仓库地址可以通过https://github.com/DaoCloud/public-image-mirror进行查找&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;cat&amp;nbsp;/etc/docker/daemon.json
{
&amp;nbsp;&amp;nbsp;&amp;quot;registry-mirrors&amp;quot;:&amp;nbsp;[
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;https://docker.m.daocloud.io&amp;quot;
&amp;nbsp;&amp;nbsp;]
}


systemctl&amp;nbsp;daemon-reload
systemctl&amp;nbsp;restart&amp;nbsp;docker
docker&amp;nbsp;info&amp;nbsp;&amp;nbsp;#关注Registry&amp;nbsp;Mirrors输出是否生效&lt;/pre&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Wed, 25 Mar 2026 17:37:18 +0800</pubDate></item><item><title>【系统运维】Linux软件防火墙firewalld/iptable配置教程</title><link>https://ywpie.com/post/75.html</link><description>&lt;h2 style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;一、iptables与firewalld区别&lt;/span&gt;&lt;/strong&gt;&lt;/h2&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;Linux系统通过内核&lt;span style=&quot;text-wrap-style: initial;&quot;&gt;netfilter模块对数据包进行过滤，以此实现软件防火墙功能&lt;/span&gt;。在 CentOS7 前一般使用iptables作为管理工具，从&lt;span style=&quot;text-wrap-style: initial;&quot;&gt;CentOS7 之后则更多使用firewalld作为管理工具。两者本质上都是&lt;span style=&quot;font-size: 16px; text-wrap-mode: wrap;&quot;&gt;netfilter模块的管理工具，但是&amp;nbsp;&lt;/span&gt;&lt;/span&gt;firewalld 在使用配置上比 iptables 更为易懂，并且提供了区域（zone）、服务等更高级的概念，更适合需要动态调整防火墙策略的环境&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2 style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong&gt;二、&lt;strong style=&quot;text-wrap-style: initial;&quot;&gt;iptables&amp;nbsp;&lt;/strong&gt;结构&lt;/strong&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;iptables由表和链构成，在表中去定义链的规则&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://ywpie.com/zb_users/upload/2026/02/202602271772176330172114.png&quot; title=&quot;iptable1.png&quot; alt=&quot;iptable1.png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong&gt;· f&lt;/strong&gt;&lt;strong&gt;ilter表&lt;/strong&gt;&lt;strong&gt;(默认表)&lt;/strong&gt;：最常用的表，用于过滤数据包的进出，其中又包含了3个规则链：&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;span style=&quot;background-color: #FFE500;&quot;&gt;INPUT&lt;/span&gt;：负责过滤进入主机的数据包&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;OUTPUT：负责过滤主机发出的数据包&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;FORWARD：负责转发该主机的数据包到其他目标地址&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong&gt;&lt;strong style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px; text-wrap-mode: wrap;&quot;&gt;·&amp;nbsp;&lt;/strong&gt;nat表&lt;/strong&gt;&lt;strong&gt;（网络地址转换）&lt;/strong&gt;：多用于内外网地址转换，包含了3个链：&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;span style=&quot;background-color: #FFE500;&quot;&gt;PREROUTING&lt;/span&gt;：实现DNAT功能，改变数据包的目的地址，多用于局域网接收公网数据时将目标的地址转换为局域网的一个地址，&lt;span style=&quot;background-color: #FFE500;&quot;&gt;实现内网跳板机的功能&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;POSTROUTING：实现SNAT功能，改变数据包的源地址，多用于局域网向公网发送数据时将地址转换为公网地址&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;OUTPUT：同filter表OUTPUT&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong&gt;&lt;strong style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px; text-wrap-mode: wrap;&quot;&gt;·&amp;nbsp;&lt;/strong&gt;mangle表（不常用）：&lt;/strong&gt;拆解、修改、重新封装数据包&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong&gt;&lt;strong style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px; text-wrap-mode: wrap;&quot;&gt;·&amp;nbsp;&lt;/strong&gt;raw表&lt;strong style=&quot;text-wrap-style: initial;&quot;&gt;（不常用）&lt;/strong&gt;：&lt;/strong&gt;对数据包进行状态跟踪&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong&gt;&lt;br/&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2 style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;line-height: 1.5; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong&gt;三、iptables 用法介绍&lt;/strong&gt;&lt;/span&gt;&lt;/h2&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;表名不写的话默认为filter表
#&amp;nbsp;iptables&amp;nbsp;[-t&amp;nbsp;表名]&amp;nbsp;选项&amp;nbsp;[链名]&amp;nbsp;条件匹配&amp;nbsp;-j&amp;nbsp;执行动作&amp;nbsp;&amp;nbsp;
#&amp;nbsp;为filter表的INPUT链增加规则，当目标端口为80并且为tcp协议则放行
iptables&amp;nbsp;-t&amp;nbsp;filter&amp;nbsp;-A&amp;nbsp;INPUT&amp;nbsp;-p&amp;nbsp;tcp&amp;nbsp;--dport&amp;nbsp;80&amp;nbsp;-j&amp;nbsp;ACCEPT&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;h3 style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;1、Firewalld（iptables）常用选项&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;line-height: 24px; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong&gt;-A |&lt;/strong&gt;&lt;strong&gt;-D |&lt;/strong&gt;&lt;strong&gt;-I &amp;nbsp;[CHAINS]：&lt;/strong&gt;给指定的链增加或者删除或者插入一个规则&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;iptables&amp;nbsp;-A&amp;nbsp;INPUT&amp;nbsp;-p&amp;nbsp;tcp&amp;nbsp;--dport&amp;nbsp;80&amp;nbsp;-j&amp;nbsp;DROP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#增加一条规则用于测试&amp;nbsp;&amp;nbsp;
iptables&amp;nbsp;-L&amp;nbsp;--line-numbers&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#加上--line-numbers参数可以显示规则的编号，可以看到之前设置的编号为1
iptables&amp;nbsp;-D&amp;nbsp;INPUT&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#删除编号为1的规则&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;line-height: 24px; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;-L：&lt;/strong&gt;显示所有链下的所有规则，&lt;span style=&quot;background-color: #FFE500;&quot;&gt;默认是filter表，可以用-t选项指定其他表&lt;/span&gt;。还可以跟上-n选项，对主机或端口信息不做反向解析；-v显示更详细信息；--line-numbers显示行号&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;iptables&amp;nbsp;-t&amp;nbsp;filter&amp;nbsp;-L&amp;nbsp;-n&amp;nbsp;&amp;nbsp;&amp;nbsp;
Chain&amp;nbsp;INPUT&amp;nbsp;(policy&amp;nbsp;ACCEPT)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#INPUT链下的规则
target&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;prot&amp;nbsp;opt&amp;nbsp;source&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;destination&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;

Chain&amp;nbsp;FORWARD&amp;nbsp;(policy&amp;nbsp;ACCEPT)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#FORWARD链下的规则
target&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;prot&amp;nbsp;opt&amp;nbsp;source&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;destination&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;

Chain&amp;nbsp;OUTPUT&amp;nbsp;(policy&amp;nbsp;ACCEPT)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#OUTPUT链下的规则
target&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;prot&amp;nbsp;opt&amp;nbsp;source&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;destination&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong&gt;-N&lt;/strong&gt;：创建自定义链，针对不同的场景创造不同的链，方便管理&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;iptables&amp;nbsp;-I&amp;nbsp;INPUT&amp;nbsp;-p&amp;nbsp;tcp&amp;nbsp;--dport&amp;nbsp;80&amp;nbsp;-j&amp;nbsp;IN_WEB&amp;nbsp;&amp;nbsp;#将80请求转发给自定义链IN_WEB
iptables&amp;nbsp;-N&amp;nbsp;IN_WEB&amp;nbsp;&amp;nbsp;#创建自定义链
iptables&amp;nbsp;-I&amp;nbsp;IN_WEB&amp;nbsp;-s&amp;nbsp;192.168.1.0/24&amp;nbsp;-j&amp;nbsp;ACCEPT&amp;nbsp;#定义自定义链的具体规则&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;-X：清空用户自定义链&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;-Z：计数器归零&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;-F：清空所有规则或者指定规则&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;iptables&amp;nbsp;-F&amp;nbsp;&amp;nbsp;#清空所有规则
iptables&amp;nbsp;-F&amp;nbsp;INPUT&amp;nbsp;&amp;nbsp;#清空filter表INPUT链中的规则
iptables&amp;nbsp;-t&amp;nbsp;nat&amp;nbsp;-F&amp;nbsp;PREROUTING&amp;nbsp;&amp;nbsp;#清空nat表PREROUTING中的规则&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;-j &amp;nbsp;ACCEPT | DROP | REJECT | DNAT | SNAT | MASQUERADE | MARK&lt;/strong&gt;：指定防火墙的行为，ACCEPT是允许；DROP是丢弃（放弃响应对方请求且不作答复）；REJECT是拒绝（会明确给对方一个消息说自己拒绝请求）;DNAT为目标地址转换；SNAT为源地址转换；MASQUERADE是地址伪装；MARK防火墙标记，可用于LVS持久连接&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;-p（小写）：&lt;/strong&gt;指定协议，如tcp、udp、icmp、all&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong&gt;-i：&lt;/strong&gt;指定网络设备，如eth0&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong&gt;-&lt;/strong&gt;&lt;strong&gt;P&lt;/strong&gt;（大写）：指定默认的规则。在生产环境中可以把默认规则设置为拒绝，然后对需要放行的服务设置允许规则，不过做这个设置时要&lt;span style=&quot;background-color: #FFE500;&quot;&gt;注意把22端口放行&lt;/span&gt;，不然自己就无法远程上服务器了&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;iptables&amp;nbsp;-P&amp;nbsp;INPUT&amp;nbsp;DROP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#把INPUT链的默认规则改为DROP&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;-s：&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;指定客户端源地址，通常是对访问来源做限制&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;-s&amp;nbsp;192.168.0.1&amp;nbsp;&amp;nbsp;#匹配来自192.168.0.1的数据包
-s&amp;nbsp;192.168.1.0/24&amp;nbsp;&amp;nbsp;#匹配来自192.168.1.0/24的数据包&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;&lt;br/&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;--dport&lt;/strong&gt;：指定目标端口，需配合-p选项。通常是对访问的端口做限制，可以指定连续的端口&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;iptables&amp;nbsp;-A&amp;nbsp;INPUT&amp;nbsp;-p&amp;nbsp;tcp&amp;nbsp;--dport&amp;nbsp;80&amp;nbsp;-j&amp;nbsp;DROP&amp;nbsp;&amp;nbsp;
iptables&amp;nbsp;-I&amp;nbsp;INPUT&amp;nbsp;-p&amp;nbsp;tcp&amp;nbsp;--dport&amp;nbsp;10000:10010&amp;nbsp;-j&amp;nbsp;DROP&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong&gt;--sport&lt;/strong&gt;：指定源端口，需配合-p选项&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;--dport&amp;nbsp;80
--dport&amp;nbsp;1000:2000
--dport&amp;nbsp;:3000&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;line-height: 24px; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong&gt;· -m multiport：&lt;/strong&gt;可以定义多个端口或者范围，最多指定15个&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;[!] --sports port[,port|,port:port]...：指定多个源端口&lt;br/&gt;[!] --dports port[,port|,port:port]...：指定多个目标端口&lt;br/&gt;[!] --ports port[,port|,port:port]...：同时指定源端口和目标端口&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;iptables&amp;nbsp;-t&amp;nbsp;filter&amp;nbsp;-A&amp;nbsp;INPUT&amp;nbsp;-s&amp;nbsp;192.168.100.10&amp;nbsp;-d&amp;nbsp;192.168.100.20&amp;nbsp;-p&amp;nbsp;tcp&amp;nbsp;-m&amp;nbsp;multiport&amp;nbsp;--dports&amp;nbsp;22,80&amp;nbsp;-j&amp;nbsp;ACCEPT&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;span style=&quot;line-height: 24px;&quot;&gt;&lt;strong&gt;· -m iprange&lt;/strong&gt;：指明连续的IP地址范围&lt;/span&gt;&amp;nbsp;&lt;br/&gt;[!] --src-range from[-to]：源IP地址&lt;br/&gt;[!] --dst-range from[-to]：目标IP地址&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;iptables&amp;nbsp;-A&amp;nbsp;INPUT&amp;nbsp;-p&amp;nbsp;tcp&amp;nbsp;--dport&amp;nbsp;80&amp;nbsp;-m&amp;nbsp;iprange&amp;nbsp;--src-range&amp;nbsp;192.168.100.50-192.168.100.60&amp;nbsp;-j&amp;nbsp;DROP&amp;nbsp;#拒绝192.168.100.50-60这几个IP对80端口的访问&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;· -m connlimit&lt;/strong&gt;：根据客户端IP并发连接数做限制&lt;br/&gt;--connlimit-upto n：连接的数量小于等于n时匹配&lt;br/&gt;--connlimit-above n：连接的数量大于n时匹配&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush: bash;auto-links: false;&quot;&gt;iptables&amp;nbsp;-A&amp;nbsp;INPUT&amp;nbsp;-p&amp;nbsp;tcp&amp;nbsp;--dport&amp;nbsp;80&amp;nbsp;-m&amp;nbsp;connlimit&amp;nbsp;--connlimit-above&amp;nbsp;10&amp;nbsp;-j&amp;nbsp;DROP&amp;nbsp;#对80端口连接数大于10个就拒绝&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;br/&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;· -m limit&lt;/strong&gt;：基于速率做限制&lt;br/&gt;--limit N[/second|/minute|/hour|/day]：平均速率，比如每分钟允许N个请求&lt;br/&gt;--limit-burst&amp;nbsp;&lt;em style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;number&lt;/em&gt;：初始放行数量&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush: bash;auto-links: false;&quot;&gt;iptables&amp;nbsp;-I&amp;nbsp;INPUT&amp;nbsp;-d&amp;nbsp;192.168.100.10&amp;nbsp;-p&amp;nbsp;icmp&amp;nbsp;-m&amp;nbsp;limit&amp;nbsp;--limit&amp;nbsp;3/minute&amp;nbsp;&amp;nbsp;#每个客户端每分钟只能有3次请求&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong&gt;· -m string&lt;/strong&gt;：根据字符串进行匹配&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;iptables&amp;nbsp;-I&amp;nbsp;INPUT&amp;nbsp;-p&amp;nbsp;tcp&amp;nbsp;--dport&amp;nbsp;80&amp;nbsp;-m&amp;nbsp;string&amp;nbsp;--algo&amp;nbsp;bm&amp;nbsp;--string&amp;nbsp;&amp;#39;www.baidu.com&amp;#39;&amp;nbsp;-j&amp;nbsp;DROP&amp;nbsp;#不允许访问baidu.com，--alog&amp;nbsp;bm是一种算法&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong&gt;· -m time&lt;/strong&gt;：根据时间进行匹配&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;-m&amp;nbsp;time&amp;nbsp;--datestart&amp;nbsp;2019-05-01&amp;nbsp;--datestop&amp;nbsp;2019-05-04&amp;nbsp;&amp;nbsp;#匹配五一节
iptables&amp;nbsp;-I&amp;nbsp;OUTPUT&amp;nbsp;-p&amp;nbsp;tcp&amp;nbsp;--dport&amp;nbsp;80&amp;nbsp;-m&amp;nbsp;time&amp;nbsp;--timestart&amp;nbsp;12:30&amp;nbsp;--timestop&amp;nbsp;13:30&amp;nbsp;--kerneltz&amp;nbsp;2019-05-04&amp;nbsp;&amp;nbsp;-j&amp;nbsp;DROP&amp;nbsp;#午休拒绝上网&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;· -m state&lt;/strong&gt;：根据连接追踪机制检查连接的状态&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;[!] --state&amp;nbsp;&lt;em style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;state&lt;/em&gt;：&lt;em style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;state&lt;/em&gt;包含以下几种状态&lt;br/&gt;NEW：新请求&lt;br/&gt;ESTABLISHED：NEW状态后所建立好的连接&lt;br/&gt;RELATED：相关联的连接，如FTP服务有2个端口且相关&lt;br/&gt;INVALID：无效连接&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;iptables&amp;nbsp;-A&amp;nbsp;INPUT&amp;nbsp;-d&amp;nbsp;192.168.100.10&amp;nbsp;-p&amp;nbsp;tcp&amp;nbsp;-m&amp;nbsp;multiport&amp;nbsp;--dports&amp;nbsp;22,80&amp;nbsp;-m&amp;nbsp;state&amp;nbsp;--state&amp;nbsp;NEW,ESTABLISHED&amp;nbsp;-j&amp;nbsp;ACCEPT&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;h3 dir=&quot;ltr&quot; style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong&gt;2、iptables 示例&lt;/strong&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p dir=&quot;ltr&quot; style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;· 单服务器防护，对明确端口的服务放行，其他全部拒绝&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;iptables&amp;nbsp;-A&amp;nbsp;INPUT&amp;nbsp;-p&amp;nbsp;tcp&amp;nbsp;--dport&amp;nbsp;22&amp;nbsp;-j&amp;nbsp;ACCEPT&amp;nbsp;&amp;nbsp;#放行ssh服务
iptables&amp;nbsp;-A&amp;nbsp;OUTPUT&amp;nbsp;-p&amp;nbsp;tcp&amp;nbsp;--sport&amp;nbsp;22&amp;nbsp;-j&amp;nbsp;ACCEPT

iptables&amp;nbsp;-A&amp;nbsp;INPUT&amp;nbsp;-p&amp;nbsp;tcp&amp;nbsp;-m&amp;nbsp;multiport&amp;nbsp;--dport&amp;nbsp;443,80&amp;nbsp;-j&amp;nbsp;ACCEPT&amp;nbsp;&amp;nbsp;#放行443,80端口
iptables&amp;nbsp;-A&amp;nbsp;INPUT&amp;nbsp;-p&amp;nbsp;tcp&amp;nbsp;-dport&amp;nbsp;3306&amp;nbsp;-m&amp;nbsp;iprange&amp;nbsp;--src-range&amp;nbsp;192.168.1.201-192.168.1.210&amp;nbsp;-j&amp;nbsp;ACCEPT&amp;nbsp;&amp;nbsp;#允许特定IP访问3306端口
iptables&amp;nbsp;-A&amp;nbsp;OUTPUT&amp;nbsp;-p&amp;nbsp;tcp&amp;nbsp;-dport&amp;nbsp;3306&amp;nbsp;-m&amp;nbsp;iprange&amp;nbsp;--dst-range&amp;nbsp;192.168.1.201-192.168.1.210&amp;nbsp;-j&amp;nbsp;ACCEPT&amp;nbsp;

iptables&amp;nbsp;-A&amp;nbsp;INPUT&amp;nbsp;-i&amp;nbsp;lo&amp;nbsp;-j&amp;nbsp;ACCEPT&amp;nbsp;&amp;nbsp;#本地连接都允许
iptables&amp;nbsp;-A&amp;nbsp;OUTPUT&amp;nbsp;-i&amp;nbsp;lo&amp;nbsp;-j&amp;nbsp;ACCEPT

iptables&amp;nbsp;-A&amp;nbsp;OUTPUT&amp;nbsp;-m&amp;nbsp;state&amp;nbsp;--state&amp;nbsp;NEW,ESTABLISHED,RELATED&amp;nbsp;-j&amp;nbsp;ACCEPT&amp;nbsp;#根据连接状态放行
iptables&amp;nbsp;-A&amp;nbsp;INPUT&amp;nbsp;-m&amp;nbsp;state&amp;nbsp;--state&amp;nbsp;ESTABLISHED,RELATED&amp;nbsp;-j&amp;nbsp;ACCEPT

iptables&amp;nbsp;-P&amp;nbsp;INPUT&amp;nbsp;DROP
iptables&amp;nbsp;-P&amp;nbsp;OUTPUT&amp;nbsp;DROP&lt;/pre&gt;&lt;p dir=&quot;ltr&quot; style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;span style=&quot;text-wrap-style: initial;&quot;&gt;·&amp;nbsp;&lt;/span&gt;局域网共享一个公网地址实现上网。将一台拥有内网、外网双网卡的服务器作为路由器，配置iptables规则，局域网内其他机器将网关地址指向到该路由器内网网卡地址即可&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;iptables&amp;nbsp;-t&amp;nbsp;nat&amp;nbsp;POSTROUTING&amp;nbsp;-s&amp;nbsp;192.169.1.100&amp;nbsp;-o&amp;nbsp;eth0&amp;nbsp;-j&amp;nbsp;SNAT&amp;nbsp;-to-source&amp;nbsp;222.201.178.10&lt;/pre&gt;&lt;p dir=&quot;ltr&quot; style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;span style=&quot;text-wrap-style: initial;&quot;&gt;·&amp;nbsp;&lt;/span&gt;跳板机功能&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;打开系统IP转发功能
echo&amp;nbsp;1&amp;nbsp;&amp;gt;&amp;nbsp;/proc/sys/net/ipv4/ip_forward&amp;nbsp;#临时开启
#永久生效
vi&amp;nbsp;/etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl&amp;nbsp;-p

#请求本机21022端口将跳转到192.168.17.47:3306端口
iptables&amp;nbsp;-t&amp;nbsp;nat&amp;nbsp;-A&amp;nbsp;PREROUTING&amp;nbsp;-i&amp;nbsp;eth0&amp;nbsp;-p&amp;nbsp;tcp&amp;nbsp;--dport&amp;nbsp;21022&amp;nbsp;-j&amp;nbsp;DNAT&amp;nbsp;--to-destination&amp;nbsp;192.168.17.47:3306

#如果客户端172.20.1.132访问172.20.7.101:3306端口，将转发到172.20.7.100:3311端口，该配置是在172.20.7.101完成
iptables&amp;nbsp;-t&amp;nbsp;nat&amp;nbsp;-A&amp;nbsp;PREROUTING&amp;nbsp;-d&amp;nbsp;172.20.7.101&amp;nbsp;-p&amp;nbsp;tcp&amp;nbsp;-s&amp;nbsp;172.20.1.132&amp;nbsp;--dport&amp;nbsp;3312&amp;nbsp;-j&amp;nbsp;DNAT&amp;nbsp;--to-destination&amp;nbsp;172.20.7.100:3311
iptables&amp;nbsp;-t&amp;nbsp;nat&amp;nbsp;-A&amp;nbsp;POSTROUTING&amp;nbsp;-d&amp;nbsp;172.20.7.100&amp;nbsp;-p&amp;nbsp;tcp&amp;nbsp;--dport&amp;nbsp;3311&amp;nbsp;-j&amp;nbsp;SNAT&amp;nbsp;--to-source&amp;nbsp;172.20.7.101&lt;/pre&gt;&lt;p dir=&quot;ltr&quot; style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;blockquote style=&quot;text-wrap-mode: wrap; border-width: medium; border-style: none; border-color: initial; padding: 0px; margin: 0px 0px 0px 40px;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong&gt;3、iptables 规则的保存与恢复&lt;/strong&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;iptables 的规则默认存储在内存中，重启后会丢失，可以通过命令进行规则持久化&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#保存当前配置的规则到指定文件
iptables-save&amp;nbsp;&amp;gt;&amp;nbsp;filename&amp;nbsp;&amp;nbsp;

#从配置文件还原规则
iptabels-restore&amp;nbsp;&amp;lt;&amp;nbsp;filename&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;h2 style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;strong style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px; text-wrap-style: initial;&quot;&gt;四、firewalld 用法介绍&lt;/strong&gt;&lt;/h2&gt;&lt;h3 style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;strong style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px; text-wrap-style: initial;&quot;&gt;1、服务管理&lt;/strong&gt;&lt;/h3&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;systemctl&amp;nbsp;status&amp;nbsp;firewalld&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;检查状态
systemctl&amp;nbsp;start&amp;nbsp;firewalld&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;启动服务
systemctl&amp;nbsp;stop&amp;nbsp;firewalld&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;停止服务
systemctl&amp;nbsp;enable&amp;nbsp;firewalld&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;开机自启
firewall-cmd&amp;nbsp;--reload&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;重新加载配置&lt;/pre&gt;&lt;h3 style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;strong style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px; text-wrap-style: initial;&quot;&gt;2、firewalld 区域（&lt;strong style=&quot;text-wrap-style: initial;&quot;&gt;zone&lt;/strong&gt;）配置&lt;/strong&gt;&lt;/h3&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;firewall-cmd&amp;nbsp;get-zones&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#查看所有zone
firewall-cmd&amp;nbsp;--get-default-zone&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#查看默认区域
firewall-cmd&amp;nbsp;--list-all&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#查看默认zone的规则
firewall-cmd&amp;nbsp;--list-all&amp;nbsp;--zone=public&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#查看指定zone的规则
firewall-cmd&amp;nbsp;&amp;nbsp;--set-default-zone=test_zone&amp;nbsp;&amp;nbsp;#指定默认区域&lt;/pre&gt;&lt;h3 style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong&gt;3、&lt;strong style=&quot;text-wrap-style: initial; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;firewalld&amp;nbsp;&lt;/strong&gt;规则管理&lt;strong style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; text-wrap-style: initial;&quot;&gt;&lt;/strong&gt;&lt;br/&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;firewalld中可分为service（针对服务）、port（针对端口）、rich rule（富规则）三种配置方式，添加的规则都需要reload才会生效并能查看，permanent表示永久生效&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#针对服务
firewall-cmd&amp;nbsp;--zone=public&amp;nbsp;--add-service=http&amp;nbsp;--permanent&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;添加&amp;nbsp;HTTP&amp;nbsp;服务
firewall-cmd&amp;nbsp;--zone=public&amp;nbsp;--remove-service=http&amp;nbsp;--permanent&amp;nbsp;#&amp;nbsp;移除&amp;nbsp;HTTP&amp;nbsp;服务

#&amp;nbsp;端口管理
firewall-cmd&amp;nbsp;--zone=public&amp;nbsp;--add-port=8080/tcp&amp;nbsp;--permanent&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;添加单个端口
firewall-cmd&amp;nbsp;--zone=public&amp;nbsp;--remove-port=8080/tcp&amp;nbsp;--permanent&amp;nbsp;#&amp;nbsp;移除端口

#&amp;nbsp;允许/拒绝特定&amp;nbsp;IP
firewall-cmd&amp;nbsp;--zone=public&amp;nbsp;--add-rich-rule=&amp;#39;rule&amp;nbsp;family=&amp;quot;ipv4&amp;quot;&amp;nbsp;source&amp;nbsp;address=&amp;quot;192.168.1.10&amp;quot;&amp;nbsp;accept&amp;#39;&amp;nbsp;--permanent
firewall-cmd&amp;nbsp;--zone=public&amp;nbsp;--add-rich-rule=&amp;#39;rule&amp;nbsp;family=&amp;quot;ipv4&amp;quot;&amp;nbsp;source&amp;nbsp;address=&amp;quot;192.168.1.20&amp;quot;&amp;nbsp;reject&amp;#39;&amp;nbsp;--permanent

#&amp;nbsp;端口转发
firewall-cmd&amp;nbsp;--zone=public&amp;nbsp;--add-forward-port=port=80:proto=tcp:toport=8080&amp;nbsp;--permanent

#&amp;nbsp;修改默认区域
firewall-cmd&amp;nbsp;--set-default-zone=home&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Fri, 27 Feb 2026 15:10:59 +0800</pubDate></item><item><title>MySQL教程（12）锁的原理与常见锁问题处理</title><link>https://ywpie.com/post/74.html</link><description>&lt;h2&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;&lt;strong&gt;一、数据库锁的作用&lt;/strong&gt;&lt;/span&gt;&lt;br/&gt;&lt;/h2&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;数据库锁主要用于解决并发问题，当并发操作发生时，数据库依靠锁来控制这些并发请求对资源（锁是针对资源而非事务）的访问规则，&lt;span style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;因为被上锁的资源不会被其他事务修改，因为可以&lt;/span&gt;保证事务之间的隔离性与一致性&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;&lt;strong&gt;二、MySQL锁分类&lt;/strong&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;&lt;strong&gt;1、按粒度分为全局锁、表锁、行锁&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;Microsoft YaHei&amp;quot;; background-color: #FFFFFF;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;·&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;Microsoft YaHei&amp;quot;; background-color: #FFFF00;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;全局锁&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;对整个数据库加读锁，当需要让整个数据库处于只读状态时才会加全局读锁，比如需要对使用非InnoDB引擎的数据库做全库逻辑备份。加锁后其他线程的增删改语句、建表、修改表结构语句都会被阻塞，&lt;span style=&quot;background-color: #FFFF00;&quot;&gt;只能进行查询操作&lt;/span&gt;，当上锁的客户端断开时会自动释放全局锁&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;mysql&amp;nbsp;&amp;gt;&amp;nbsp;flush&amp;nbsp;tables&amp;nbsp;with&amp;nbsp;read&amp;nbsp;lock&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;Microsoft YaHei&amp;quot;; background-color: #FFFFFF;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;·&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;Microsoft YaHei&amp;quot;; background-color: #FFFF00;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;表锁&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;对整个表进行上锁，表锁开销小、加锁速度快，不会出现死锁，但是发生冲突概率高，导致数据库并发低。用EXCEL举例的话就是用户A正在编辑的表格文件，用户B是无法编辑的。通常数据库引擎不支持行锁的情况下才会用到表锁。适用于查询为主、少量更新的应用，如WEB应用（需要注意全表扫描行为其实也是属于表锁，只不过数据库Server层进行了过滤优化）&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;mysql&amp;nbsp;&amp;gt;&amp;nbsp;lock&amp;nbsp;tables&amp;nbsp;t1&amp;nbsp;read&amp;nbsp;&amp;nbsp;#给t1表上读锁，自己和其他事务可读，但是都不可写
mysql&amp;nbsp;&amp;gt;&amp;nbsp;unlock&amp;nbsp;tables&amp;nbsp;&amp;nbsp;#释放锁

mysql&amp;nbsp;&amp;gt;&amp;nbsp;lock&amp;nbsp;tables&amp;nbsp;t1&amp;nbsp;write&amp;nbsp;;&amp;nbsp;#给t1表上写锁，仅上锁的事务可读可写
mysql&amp;nbsp;&amp;gt;&amp;nbsp;unlock&amp;nbsp;tables&amp;nbsp;&amp;nbsp;#释放锁&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;background-color: #FFFFFF;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;&lt;strong style=&quot;font-family: &amp;quot;Microsoft YaHei&amp;quot;; text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;·&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #FFFF00;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;&lt;strong style=&quot;font-family: &amp;quot;Microsoft YaHei&amp;quot;; text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/strong&gt;元数据锁&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;表锁的另一种形式，在对表进行DDL操作时，如果有其他事务对该表并发执行DML操作，这些后续的DML都会被阻塞，反过来先有DML再DDL也会有阻塞情况，这都是因为MDL元数据锁的存在。该锁&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;不需要显式使用，事务执行UPDATE、INSERT等操作修改数据时都会对表加MDL写锁，而事务SELECT读取数据时也会自动加MDL读锁，让查询语句未结束无法对数据进行变更。MDL的存在避免DDL操作影响了事务的正常执行，还可以控制不同线程之间事务的执行顺序，避免主从数据不一致。不过也因为MDL的存在，有时候给一个小表进行变更的时候会导致数据库挂掉，如下图：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;1、session&amp;nbsp;A进行查询，此时会对表加一个MDL读锁&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;2、session&amp;nbsp;B进行查询，需要的也是MDL读锁，因此不会互斥，可以正常执行&lt;br/&gt;3、session&amp;nbsp;C修改表结构会被卡住，因为session&amp;nbsp;A的MDL读锁还没有释放，而session&amp;nbsp;C需要MDL写锁，二者互斥&lt;br/&gt;4、后续要对该表申请MDL读锁的请求全部会被session&amp;nbsp;C阻塞，因为&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;所有对表的增删改查操作都需要先申请MDL读锁，自然都被锁住，这个表完全不可读写了&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;5、如该表查询语句频繁且客户端有重试机制，数据库线程很快就会撑满&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://ywpie.com/zb_users/upload/2026/02/202602111770791687281689.png&quot; title=&quot;锁1.png&quot; alt=&quot;锁1.png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;; background-color: #FFFFFF;&quot;&gt;&lt;strong style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;strong style=&quot;font-family: &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;·&amp;nbsp;&lt;/strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;; background-color: #FFFF00;&quot;&gt;&lt;strong style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;strong style=&quot;font-family: &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;/strong&gt;意向锁&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;意向锁分为意向共享锁（IS）和意向排他锁（IX），它们都是由存储引擎自行维护的，无法手动去操作意向锁。事务在加共享锁或者排他锁的时候，会自动在该表上添加对应的意向共享锁或意向排他锁。当有其他事务产生时，存储引擎会先获取该数据行所在表上对应的意向锁，这样实现高效的锁冲突检测。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;举例说明，比如t1表有10万行数据，某事务只修改了其中一行，这个时候除了被修改的一行会上行锁以外，还会在表上加上意向排他锁。这样后续的事务想对该表进行更新需要上锁的时候只需要先看该表有没有意向锁就可以了，如果没有意向锁的话就需要遍历每一行才知道这个事情&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;color: #333333; font-size: 16px; font-family: &amp;quot;&amp;quot;; background-color: #FFFFFF;&quot;&gt;&lt;strong style=&quot;font-family: &amp;quot;font-size:16px;white-space:normal;&amp;quot;;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;·&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; font-size: 16px; font-family: &amp;quot;&amp;quot;; background-color: #FFFF00;&quot;&gt;&lt;strong style=&quot;font-family: &amp;quot;font-size:16px;white-space:normal;&amp;quot;;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;行锁&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; color: #333333; font-family: &amp;quot;font-size:16px;background-color:#FFFFFF;&amp;quot;;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;InnoDB引擎默认使用行级锁，行锁相对表锁来性能开销更大，但是可以最大程度地支持并发，冲突概率较低，有可能出现死锁，适合并发度高的业务&lt;/span&gt;&lt;span style=&quot;color: #000000; font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;。&lt;span style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;用EXCEL举例的话就是用户A正在编辑表格第9行，那么只有第9行是其他用户无法编辑的。&lt;/span&gt;InnoDB 的行级锁是通过对索引项加锁来实现的。当查询使用索引时，InnoDB 能够高效地加行级锁。如果查询未使用索引，InnoDB 会进行全表扫描并对扫描到的行逐行加锁，而如果是写操作，如果没有使用索引并且影响的数据行数较多（接近全表），InnoDB为了简化锁管理，会升级会表锁。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;background-color: #FFFFFF; font-family: &amp;quot;font-size:16px;&amp;quot;; font-size: 16px;&quot;&gt;UPDATE 和 DELETE 操作都会为数据加行锁，且锁的类型都是独占锁(X型锁)，而普通的 SELECT 语句属于快照读不会对记录加锁，如果要在查询时对记录加行级锁可以使用锁定读的方式实现&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#对读取的记录加共享锁(S型锁)
select&amp;nbsp;...&amp;nbsp;lock&amp;nbsp;in&amp;nbsp;share&amp;nbsp;mode;
select&amp;nbsp;...&amp;nbsp;lock&amp;nbsp;for&amp;nbsp;share;&amp;nbsp;&amp;nbsp;#&amp;nbsp;8.0新增语法

#对读取的记录加独占锁(X型锁)
select&amp;nbsp;...&amp;nbsp;for&amp;nbsp;update;&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;· 页锁&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;：开销和并发都介于表锁和行锁之间，会出现死锁&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;&lt;strong&gt;2、&lt;/strong&gt;&lt;strong&gt;按数据操作类型分为读锁和写锁&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;; background-color: #FFFFFF;&quot;&gt;&lt;strong style=&quot;font-size: 16px; text-wrap-mode: wrap;&quot;&gt;·&amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;; background-color: #FFFF00;&quot;&gt;&lt;strong style=&quot;font-size: 16px; text-wrap-mode: wrap;&quot;&gt;读锁&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;span style=&quot;text-wrap: wrap; background-color: #FFFF00;&quot;&gt;读锁也可称为共享锁、S锁。&lt;span style=&quot;text-wrap-style: initial; background-color: #FFFFFF;&quot;&gt;当读取一行数据时，为了防止数据被其他事务修改而产生数据不一致的情况，此时就需要对该数据添加S锁&lt;/span&gt;&lt;/span&gt;。读锁和读锁之间是兼容的，例如事务1在某一行数据上加了共享锁，另外一个事务2也是可以正常对改行进行读取的，&lt;span style=&quot;text-wrap: wrap;&quot;&gt;因为读取数据的操作并没有改变数据本身，&lt;/span&gt;这种情况锁和锁之间是兼容的&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; background-color: #FFFFFF;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;·&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 16px; background-color: #FFFF00;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;写锁&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px; background-color: #FFFF00;&quot;&gt;写锁也可称为排他锁、X锁、独占锁&lt;/span&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;。通常被修改的数据都会上写锁，这也是为了防止其他事务同时对数据进行修改或者查询&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;。写锁与写锁以及写锁与读锁之间都是互斥的，也就是说必须等当前上锁的事务结束后才能继续上其他锁&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;SELECT&amp;nbsp;*&amp;nbsp;FROM&amp;nbsp;t1&amp;nbsp;where&amp;nbsp;id=1&amp;nbsp;FOR&amp;nbsp;UPDATE&amp;nbsp;&amp;nbsp;#使用FOR&amp;nbsp;UPDATE对数据加X锁&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;&lt;strong&gt;· 间隙锁（GAP锁）&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;&lt;span style=&quot;background-color: #FFFF00;&quot;&gt;GAP&lt;/span&gt;&lt;span style=&quot;background-color: #FFFF00;&quot;&gt;只会在RR隔离级别才会产生&lt;span style=&quot;background-color: #FFFFFF;&quot;&gt;，通过&lt;/span&gt;&lt;/span&gt;对一个被事务修改的数据的空隙上锁的手段来防止幻读，但是会让死锁的机率变高。这个间隙是根据表中数据的实际情况来进行划分的，比如事务1执行“update test set num=10 where num &amp;lt; 10”，如果表中存在1,3,5,10这几个值，那么被锁的范围应该是1-3，3-5，5-10，这时执行insert into test values (8)是会被锁住的。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;假设有表数据如下图&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://ywpie.com/zb_users/upload/2026/02/202602111770791696315077.png&quot; title=&quot;锁2.png&quot; alt=&quot;锁2.png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;SELECT&amp;nbsp;*&amp;nbsp;FROM&amp;nbsp;t1&amp;nbsp;WHERE&amp;nbsp;id&amp;nbsp;&amp;gt;&amp;nbsp;15&amp;nbsp;FOR&amp;nbsp;UPDATE;&amp;nbsp;&amp;nbsp;
INSERT&amp;nbsp;INTO&amp;nbsp;t1&amp;nbsp;VALUES&amp;nbsp;(20)&amp;nbsp;&amp;nbsp;#这个被锁很好理解，&amp;gt;15区间
INSERT&amp;nbsp;INTO&amp;nbsp;t1&amp;nbsp;VALUES&amp;nbsp;(13)&amp;nbsp;&amp;nbsp;#也会被锁，因为命中了区间为(11,+∞)的GAP锁&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;3、从对待锁的态度划分（并不是真正的锁，只是锁的设计思想）&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;· 悲观锁：&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;悲观锁在处理事务的时候认为数据大概率会被修改，所以每次操作都会先上锁，此时其他事务会被阻塞。行锁、表锁、写锁、读锁这些在操作前先上锁的行为都属于悲观锁。悲观锁适用于写操作频繁的场景，如果有大量的读操作，每次读取都会加锁，降低了系统的吞吐量&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;·&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;&lt;strong&gt;乐观锁：&lt;/strong&gt;只有在进行数据提交的时候才会判断是否需要加锁。乐观锁不采用数据库自审的锁机制，通常通过程序来实现。乐观锁适用于读操作频繁的场景，如果有大量的写操作，则冲突的可能性会变高&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;h2&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;&lt;strong&gt;三、MySQL死锁问题&lt;/strong&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;1、死锁的产生&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;color:#000000;&amp;quot;;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;首先长时间的锁等待不等于死锁，偶尔的死锁也不可怕，频繁死锁就需要关注了，理论上来说&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; background-color: #FFFF00;&quot;&gt;并发度越高越容易出现死锁&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;，而并发往往不是能自己控制的。所以建议如果事务中需要锁多个行，要把最可能造成锁冲突、最可能影响并发度的锁的申请时机尽量往后放。避免出现死锁后如果某表查询语句比较频繁且客户端有重试机制，把数据库线程撑爆。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;死锁现象模拟：&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush: as3;auto-links: false;&quot;&gt;#&amp;nbsp;事务A和事务B在互相等待对方释放锁，然后形成死锁情况

#&amp;nbsp;会话A：关闭自动提交事务，修改某行数据但并不提交
mysql&amp;gt;&amp;nbsp;SET&amp;nbsp;AUTOCOMMIT&amp;nbsp;=&amp;nbsp;off;
mysql&amp;gt;&amp;nbsp;START&amp;nbsp;TRANSACTION;
mysql&amp;gt;&amp;nbsp;UPDATE&amp;nbsp;worker&amp;nbsp;SET&amp;nbsp;type&amp;nbsp;=&amp;nbsp;&amp;#39;B&amp;#39;&amp;nbsp;WHERE&amp;nbsp;id&amp;nbsp;=&amp;nbsp;1;

#&amp;nbsp;会话B：关闭自动提交事务，修改某行数据但并不提交
mysql&amp;gt;&amp;nbsp;SET&amp;nbsp;AUTOCOMMIT&amp;nbsp;=&amp;nbsp;off;
mysql&amp;gt;&amp;nbsp;START&amp;nbsp;TRANSACTION;
mysql&amp;gt;&amp;nbsp;UPDATE&amp;nbsp;worker&amp;nbsp;SET&amp;nbsp;type&amp;nbsp;=&amp;nbsp;&amp;#39;A&amp;#39;&amp;nbsp;WHERE&amp;nbsp;id&amp;nbsp;=&amp;nbsp;2;

#&amp;nbsp;会话A：更新id=2的记录，此时事务就已经卡住了，因为会话B还没有提交对该行的修改
mysql&amp;gt;&amp;nbsp;UPDATE&amp;nbsp;worker&amp;nbsp;SET&amp;nbsp;type&amp;nbsp;=&amp;nbsp;&amp;#39;A&amp;#39;&amp;nbsp;WHERE&amp;nbsp;id&amp;nbsp;=&amp;nbsp;2;

#&amp;nbsp;会话B：更新id=1的记录，出现了死锁，MySQL报错，并让重启事务
mysql&amp;gt;&amp;nbsp;UPDATE&amp;nbsp;worker&amp;nbsp;SET&amp;nbsp;type&amp;nbsp;=&amp;nbsp;&amp;#39;B&amp;#39;&amp;nbsp;WHERE&amp;nbsp;id&amp;nbsp;=&amp;nbsp;1;
ERROR&amp;nbsp;1213&amp;nbsp;(40001):&amp;nbsp;Deadlock&amp;nbsp;found&amp;nbsp;when&amp;nbsp;trying&amp;nbsp;to&amp;nbsp;get&amp;nbsp;lock;&amp;nbsp;try&amp;nbsp;resta&amp;nbsp;rting&amp;nbsp;transaction

#&amp;nbsp;会话A：更新id=2的记录成功，这是因为会话B出现死锁被KILL了，所以会话A才能执行成功，但是也经历了很长的锁等待时间&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;color:#000000;&amp;quot;;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;2、MySQL对于死锁的处理&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;当出现死锁后，如果不回滚其中一个事务就无法打破锁，MySQL数据库通过死锁检测和超时来解决死锁问题，当检测到有事务出现循环依赖的时候会返回一个错误信息或者超过锁等待时间后终止查询。为了避免死锁，最好的方式一是调整业务逻辑，避免一些会长时间持有锁的事务在前面执行。二是将大事务拆成小事务，缩短每个事务锁的时长；三是调整事务隔离级别，比如RR模式下存在的GAP锁就可能产生意料之外的死锁&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;· 等待，直到超时&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;设置锁超时时间，减少无意义的等待。但是也不能直接设置成一个很小的值，比如1S，这样虽然出现死锁的时候很快就可以解开，但如果是简单的锁等待也会被误伤&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush: as3;auto-links: false;&quot;&gt;lock_wait_timeout&amp;nbsp;=&amp;nbsp;1800&amp;nbsp;&amp;nbsp;#默认是1年，非常不合理，建议设置为1800秒足够
innodb_lock_wait_timeout=&amp;nbsp;10&amp;nbsp;&amp;nbsp;#行锁超时时间，默认50秒，建议调低&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;· 使用死锁检测自动处理&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;开启死锁自动检测机制，当事务出现死锁的时候触发，可以主动回滚死锁链条中代价较小的事务，让其他事务得以继续执行。死锁检测会消耗一定的CPU资源，复杂度是O(n)级别，比如100个并发更新同一行数据，那么检测次数就是100*100=1万次，所以如果是在一些经常出现死锁的业务场景，可以尝试关掉死锁的自动检测，让事务排队处理，节约CPU资源。&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush: as3;auto-links: false;&quot;&gt;innodb_deadlock_detect=on&amp;nbsp;&amp;nbsp;#默认已开启这个逻辑&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;h2 style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;四、MySQL 锁的分析与排查&lt;/span&gt;&lt;/strong&gt;&lt;/h2&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;h3 style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; background-color: #FFFF00;&quot;&gt;查询表锁&lt;/span&gt;&lt;/h3&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;---&amp;nbsp;查看当前数据库是否存在表锁，只要大于0就代表有表正在被锁
mysql&amp;nbsp;&amp;gt;&amp;nbsp;show&amp;nbsp;open&amp;nbsp;tables&amp;nbsp;where&amp;nbsp;in_use&amp;nbsp;&amp;gt;0&amp;nbsp;;&lt;/pre&gt;&lt;h3 style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;查看事务锁的情况&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;在MySQL 5.7或之前版本中，通过&lt;span style=&quot;color: #121212; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;font-size:medium;background-color:#FFFFFF;&amp;quot;;&quot;&gt;information_schema系统库中的INNODB_TRX、INNODB_LOCKS、INNODB_LOCK_WAITS三张表可以查看当前数据库事务与锁详情，MySQL 8.0 开始使用&amp;nbsp;&lt;span style=&quot;text-wrap-style: initial;&quot;&gt;PERFORMANCE_SCHEMA.DATA_LOCKS 替代&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-wrap-style: initial;&quot;&gt;INNODB_LOCKS&lt;/span&gt;，&lt;span style=&quot;text-wrap-style: initial;&quot;&gt;PERFORMANCE_SCHEMA.DATA_LOCK_WAITS&amp;nbsp;&lt;/span&gt;替代&amp;nbsp;&lt;span style=&quot;text-wrap-style: initial;&quot;&gt;INNODB_LOCK_WAITS&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px; color: #121212; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;font-size:medium;background-color:#FFFFFF;&amp;quot;;&quot;&gt;· innodb_trx：&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;color: #121212; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;font-size:medium;background-color:#FFFFFF;&amp;quot;; font-size: 16px;&quot;&gt;查看当前正在执行的事务&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; color: #121212; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;font-size:medium;background-color:#FFFFFF;&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;table align=&quot;center&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td width=&quot;462&quot; valign=&quot;middle&quot; align=&quot;center&quot; style=&quot;word-break: break-all; background-color: rgb(187, 187, 187);&quot;&gt;&lt;strong&gt;字段名&lt;/strong&gt;&lt;/td&gt;&lt;td width=&quot;462&quot; valign=&quot;middle&quot; align=&quot;center&quot; style=&quot;word-break: break-all; background-color: rgb(187, 187, 187);&quot;&gt;&lt;strong&gt;含义&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;middle&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;trx_id&lt;/span&gt;&lt;/td&gt;&lt;td valign=&quot;middle&quot; align=&quot;left&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;事务 ID，用于关联锁信息（&lt;/span&gt;&lt;code&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;INNODB_LOCKS&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&amp;nbsp;和&amp;nbsp;&lt;/span&gt;&lt;code&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;INNODB_LOCK_WAITS&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;）&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;462&quot; valign=&quot;middle&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;trx_state&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;462&quot; valign=&quot;middle&quot; align=&quot;left&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;事务状态，如&amp;nbsp;&lt;/span&gt;&lt;code&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;RUNNING&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;（正在运行）、&lt;/span&gt;&lt;code&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;LOCK WAIT&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;（等待锁）、&lt;/span&gt;&lt;code&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;ROLLING BACK&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;（回滚中）&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;462&quot; valign=&quot;middle&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;trx_started&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;462&quot; valign=&quot;middle&quot; align=&quot;left&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;事务开始时间，长时间未结束的事务可能是锁问题的根源&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;462&quot; valign=&quot;middle&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;trx_weight&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;462&quot; valign=&quot;middle&quot; align=&quot;left&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;事务对资源的影响程度（锁数、修改数等）&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;462&quot; valign=&quot;middle&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;trx_mysql_thread_id&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;462&quot; valign=&quot;middle&quot; align=&quot;left&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;MySQL 线程 ID，可通过&amp;nbsp;&lt;/span&gt;&lt;code&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;KILL&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&amp;nbsp;命令终止事务&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;middle&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;trx_query&lt;/span&gt;&lt;/td&gt;&lt;td valign=&quot;middle&quot; align=&quot;left&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;事务正在执行的 SQL 语句，有助于定位问题 SQL&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;strong style=&quot;text-wrap-style: initial;&quot;&gt;&lt;span style=&quot;font-size: 16px; color: #121212; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;font-size:medium;background-color:#FFFFFF;&amp;quot;;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; color: #121212; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;font-size:medium;background-color:#FFFFFF;&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;strong&gt;&lt;strong style=&quot;text-wrap-style: initial;&quot;&gt;&lt;span style=&quot;font-size: 16px; color: #121212; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;font-size:medium;background-color:#FFFFFF;&amp;quot;;&quot;&gt;·&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;INNODB_LOCKS：&lt;/strong&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;如果没有记录返回，则当前没有事务持有锁，如果有记录则说明有事务对表或行进行了锁定，配合&amp;nbsp;&lt;/span&gt;&lt;code&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;lock_trx_id&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;，到&amp;nbsp;&lt;/span&gt;&lt;code&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;INNODB_TRX&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&amp;nbsp;表中可以查看该事务的开始时间和执行的 SQL 语句，分析是否为长时间未提交的事务&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: #121212; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;· innodb_lock_waits：&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-size: 16px; background-color: #FFFFFF; color: #121212;&quot;&gt;查看当前正在等待的事务，也就是因为锁而被阻塞的事务&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;color: #121212; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;table width=&quot;948&quot;&gt;&lt;tbody&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;td width=&quot;462&quot; valign=&quot;middle&quot; align=&quot;center&quot; style=&quot;word-break: break-all; background-color: rgb(187, 187, 187);&quot;&gt;&lt;strong&gt;字段名&lt;/strong&gt;&lt;/td&gt;&lt;td width=&quot;462&quot; valign=&quot;middle&quot; align=&quot;center&quot; style=&quot;word-break: break-all; background-color: rgb(187, 187, 187);&quot;&gt;&lt;strong&gt;含义&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;middle&quot; align=&quot;center&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;requesting_trx_id&lt;br/&gt;&lt;/span&gt;&lt;/td&gt;&lt;td valign=&quot;middle&quot; align=&quot;left&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;正在等待锁的事务 ID，可关联&amp;nbsp;&lt;/span&gt;&lt;code&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;INNODB_TRX&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;462&quot; valign=&quot;middle&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;requested_lock_id&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;462&quot; valign=&quot;middle&quot; align=&quot;left&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;正在请求的锁 ID，可关联&amp;nbsp;&lt;/span&gt;&lt;code&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;INNODB_LOCKS&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;，查看具体的锁资源&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;462&quot; valign=&quot;middle&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;blocking_trx_id&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;462&quot; valign=&quot;middle&quot; align=&quot;left&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;阻塞请求的事务 ID，可关联&amp;nbsp;&lt;/span&gt;&lt;code&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;INNODB_TRX&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;，查看持有锁的事务信息&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;462&quot; valign=&quot;middle&quot; align=&quot;center&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;blocking_lock_id&lt;/span&gt;&lt;/td&gt;&lt;td width=&quot;462&quot; valign=&quot;middle&quot; align=&quot;left&quot; style=&quot;word-break: break-all;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;阻塞锁的 ID，可关联&amp;nbsp;&lt;/span&gt;&lt;code&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;INNODB_LOCKS&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;，查看具体的锁资源&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;SELECT&amp;nbsp;*&amp;nbsp;FROM&amp;nbsp;information_schema.innodb_trx&amp;nbsp;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
SELECT&amp;nbsp;*&amp;nbsp;FROM&amp;nbsp;information_schema.innodb_locks&amp;nbsp;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#查看当前存在的锁&amp;nbsp;
SELECT&amp;nbsp;*&amp;nbsp;FROM&amp;nbsp;information_schema.innodb_lock_waits;&amp;nbsp;&amp;nbsp;&amp;nbsp;
SELECT&amp;nbsp;*&amp;nbsp;FROM&amp;nbsp;sys.innodb_lock_waits&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#将information_schema.innodb_lock_waits的信息进行了整理，方便用kill命令处理&lt;/pre&gt;&lt;h3 style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;查找被锁的语句&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;1、首先简单的制造一个锁&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#事务A
mysql&amp;gt;&amp;nbsp;begin;
mysql&amp;gt;&amp;nbsp;delete&amp;nbsp;from&amp;nbsp;action1&amp;nbsp;where&amp;nbsp;id&amp;nbsp;=&amp;nbsp;3;

#事务B
mysql&amp;gt;&amp;nbsp;update&amp;nbsp;action1&amp;nbsp;set&amp;nbsp;id&amp;nbsp;=&amp;nbsp;7&amp;nbsp;where&amp;nbsp;id&amp;nbsp;=&amp;nbsp;3;&lt;/pre&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;2、&lt;span style=&quot;color: #121212; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;font-size:medium;background-color:#FFFFFF;&amp;quot;;&quot;&gt;通过show processlist命令只能看到事务B的语句一直处于执行中的状态，但是并不知道为什么被锁住。如果state字段出现很多waiting&amp;nbsp;for&amp;nbsp;...&amp;nbsp;lock，大概率也是出现了死锁，但是通过show processlist已经无法定位原因&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;3、&lt;/span&gt;&lt;span style=&quot;color: #121212; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;font-size:medium;background-color:#FFFFFF;&amp;quot;; font-size: 16px;&quot;&gt;查看当前正在执行的事务，主要关注trx_weight、trx_rows_modified、trx_rows_locked，它们代表了事务的大小和影响行数&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;SELECT&amp;nbsp;*&amp;nbsp;FROM&amp;nbsp;information_schema.innodb_trx&amp;nbsp;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#查看正在执行的事务
SELECT&amp;nbsp;*&amp;nbsp;FROM&amp;nbsp;information_schema.innodb_locks&amp;nbsp;;&amp;nbsp;&amp;nbsp;&amp;nbsp;#查看锁&amp;nbsp;
SELECT&amp;nbsp;*&amp;nbsp;FROM&amp;nbsp;information_schema.innodb_lock_waits;&amp;nbsp;&amp;nbsp;#查看被阻塞和产生阻塞的事务，但是这里的ID为数据库内部ID，并不能很快速的处理
SELECT&amp;nbsp;*&amp;nbsp;FROM&amp;nbsp;sys.innodb_lock_waits&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#将information_schema.innodb_lock_waits的信息进行了整理，方便用kill命令处理&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;&lt;span style=&quot;color: #121212; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;font-size:medium;background-color:#FFFFFF;&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;&amp;quot;;&quot;&gt;&lt;span style=&quot;color: #121212; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;font-size:medium;background-color:#FFFFFF;&amp;quot;;&quot;&gt;4、sys.innodb_lock_waits解析&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: #121212; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;font-size:medium;background-color:#FFFFFF;&amp;quot;; font-size: 16px;&quot;&gt;&lt;strong style=&quot;text-wrap-mode: wrap;&quot;&gt;waiting_trx_id&lt;/strong&gt;：&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;color: #121212; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;font-size:medium;background-color:#FFFFFF;&amp;quot;; font-size: 16px;&quot;&gt;等待锁释放的线程ID，属于MySQL内部的ID&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: #121212; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;font-size:medium;background-color:#FFFFFF;&amp;quot;; font-size: 16px;&quot;&gt;waiting_query_secs&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;color: #121212; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;font-size:medium;background-color:#FFFFFF;&amp;quot;; font-size: 16px;&quot;&gt;：因为锁导致事务的等待时间&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: #121212; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;font-size:medium;background-color:#FFFFFF;&amp;quot;; font-size: 16px;&quot;&gt;waiting_pid&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;color: #121212; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;font-size:medium;background-color:#FFFFFF;&amp;quot;; font-size: 16px;&quot;&gt;：等待锁的事务ID，也就是show processlist看到的ID&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: #121212; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;waiting_query&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;color: #121212; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;：因为锁被阻塞的SQL语句&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #121212; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;font-size:medium;background-color:#FFFFFF;&amp;quot;;&quot;&gt;blocking_trx_id&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, &amp;quot;font-size:medium;background-color:#FFFFFF;&amp;quot;;&quot;&gt;：导致锁的线程ID，属于MySQL内部的ID&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #121212; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;font-size:medium;background-color:#FFFFFF;&amp;quot;; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: #121212; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;font-size:medium;background-color:#FFFFFF;&amp;quot;; font-size: 16px;&quot;&gt;blocking_pid&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;color: #121212; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;font-size:medium;background-color:#FFFFFF;&amp;quot;; font-size: 16px;&quot;&gt;：导致锁的事务ID，，也就是show processlist看到的ID，通常是KILL的对象&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;color: #121212; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;font-size:medium;background-color:#FFFFFF;&amp;quot;; font-size: 16px;&quot;&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://ywpie.com/zb_users/upload/2026/02/202602111770793233442343.png&quot; title=&quot;锁3.png&quot; alt=&quot;锁3.png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Wed, 11 Feb 2026 14:41:56 +0800</pubDate></item><item><title>Redis教程（2）常用数据类型与数据管理</title><link>https://ywpie.com/post/72.html</link><description>&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2 style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;一、Redis 数据类型&lt;/span&gt;&lt;/h2&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;Redis最核心的5种数据类型是字符串（Strings）、哈希（hash）、列表（list）、集合（set）、有序集合（sorted set），除此之外还有高级数据类型位图（Bitmap）、HyperLogLog、地理位置（Geo），其中字符串类型是最简单、使用也最广泛的数据类型。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong style=&quot;font-family: &amp;quot;font-size:16px;color:#333333;&amp;quot;;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;· 字符串类型&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;字符串数据类型可以用于多种场景，但是单个Key的值不能超过512M。通常运用于&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px; background-color: #FFFF00;&quot;&gt;分布式系统session会话缓存共享&lt;/span&gt;、浏览计数器等，比如直播时的浏览量就可以使用incr、decr来实现，刷礼物时通过incrby命令来实现。字符串类型有点万金油，但是由于它需要额外的空间来记录数据长度、内存使用等元数据，当实际保存的数据本身很小时，元数据的空间开销反而显得就很大了&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;strong style=&quot;font-size: 16px; font-family: &amp;quot;font-size:16px;color:#333333;&amp;quot;;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;· Hash类型&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;常当作数据库缓存使用，如商品购物车、用户或者产品的详情信息。哈希类型的数据适合存储对象，其数据结构有点像MySQL表中的一行数据，包含了多个字段。MySQL是一张表里存放了多个字段和值，而Redis的Hash类型就是一个key里存放了多个字段和值。由于一个Hash对应一个集合的数据，但是也只使用一个dictEntry来存储元数据，所以会比字符串类型的数据更节省内存空间&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;strong&gt;&lt;strong style=&quot;font-family: &amp;quot;font-size:16px;color:#333333;&amp;quot;;&quot;&gt;·&amp;nbsp;&lt;/strong&gt;Redis list类型&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px; background-color: #FFFF00;&quot;&gt;list列表类型的数据一般用于消息队列&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;&lt;span style=&quot;background-color: #FFE500; font-family: &amp;quot;&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;;&quot;&gt;（比如使用Redis作为ES的消息队列，当发现ES没有日志进来的时候，可以先看redis消息队列中是否有数据），一个key可以拥有多个value，且值可重复&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;strong&gt;&lt;strong style=&quot;font-family: &amp;quot;font-size:16px;color:#333333;&amp;quot;;&quot;&gt;·&amp;nbsp;&lt;/strong&gt;Redis集合&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;分为了有序集合（zset）和无序集合（set），集合内的元素都不可重复。无序集合通过交集、差集或并集获得需要的数据，常用于社交软件共同好友、微博圈子。区别在于有序集合的每一个成员都关联一个评分(score)，可以根据这个评分对集合中的成员进行排序，成员虽然是唯一的，但是评分可以重复，常用于做排行榜场景。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;strong style=&quot;font-family: &amp;quot;font-size:16px;color:#333333;&amp;quot;;&quot;&gt;· HyperLogLog&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;该数据类型主要用于对一些海量数据进行统计，并且只会消耗少量的空间（12K的空间可以统计出2^64的数据）。比如统计数千万级别的访问请求中的独立IP数&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;strong style=&quot;font-family: &amp;quot;font-size:16px;color:#333333;&amp;quot;;&quot;&gt;· GEO类型&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;该数据类型根据设置的经纬度可以算出地理位置信息以及不同位置的距离，还可以统计出某范围内的成员，比如很多APP上附近的人就可以用该功能实现，而经纬度信息可以通过百度地图等工具进行查询&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2 style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;二、Redis 客户端使用&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;Redis 自带了命令行客户端工具&amp;nbsp;&lt;strong data-start=&quot;22&quot; data-end=&quot;35&quot;&gt;redis-cli&lt;/strong&gt;，通过该工具可以连接 Redis 并进行相关服务管理、数据操作&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;redis-cli 常用选项介绍&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;· -h&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;：指定redis的地址，域名或者ip都可以&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;font-size: 16px; text-wrap-mode: wrap;&quot;&gt;·&amp;nbsp;&lt;/span&gt;-p&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;：指定redis的端口&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;font-size: 16px; text-wrap-mode: wrap;&quot;&gt;·&amp;nbsp;&lt;/span&gt;-n&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;：指定需要连接的数据库编号&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px; text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; text-wrap-mode: wrap;&quot;&gt;·&amp;nbsp;&lt;/span&gt;-a&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-size: 16px; text-wrap-mode: wrap;&quot;&gt;：如果redis配置了密码需要使用该选项指定密码&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;font-size: 16px; text-wrap-mode: wrap;&quot;&gt;·&amp;nbsp;&lt;/span&gt;-r&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;：指定命令执行的次数&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush: bash;auto-links: false;&quot;&gt;redis-cli&amp;nbsp;-r&amp;nbsp;3&amp;nbsp;ping&amp;nbsp;#ping&amp;nbsp;三次&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;·&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;-i&lt;/strong&gt;：和r结合使用，指定多次命令执行的时间间隔，单位为秒&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;·&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;--bigkeys&lt;/strong&gt;：找到内存占用比较大的Key，如果是String类型是输出最大 bigkey 的字节长度、对于集合类型来说会输出最大 bigkey 的元素个数。该命令会扫描数据库来进行查找，对 Redis 性能有一定影响，建议在从节点上执行该命令或者使用 -i 参数控制扫描间隔，避免长时间扫描降低 Redis 实例的性能。&lt;span style=&quot;color: #333333; font-family: &amp;quot;PingFang SC&amp;quot;, Avenir, Tahoma, Arial, &amp;quot;Lantinghei SC&amp;quot;, &amp;quot;Microsoft Yahei&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft Sans Serif&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, Helvetica, sans-serif; background-color: #FFFFFF;&quot;&gt;这个方法只能返回每种类型中最大的那个 bigkey，无法得到大小排在前 N 位的 bigkey&lt;/span&gt;，对于集合类型来说只统计集合元素个数的多少，而不是实际占用的内存量&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;./redis-cli&amp;nbsp;&amp;nbsp;--bigkeys

--------&amp;nbsp;summary&amp;nbsp;-------
Sampled&amp;nbsp;32&amp;nbsp;keys&amp;nbsp;in&amp;nbsp;the&amp;nbsp;keyspace!
Total&amp;nbsp;key&amp;nbsp;length&amp;nbsp;in&amp;nbsp;bytes&amp;nbsp;is&amp;nbsp;184&amp;nbsp;(avg&amp;nbsp;len&amp;nbsp;5.75)

//统计每种数据类型中元素个数最多的bigkey
Biggest&amp;nbsp;&amp;nbsp;&amp;nbsp;list&amp;nbsp;found&amp;nbsp;&amp;#39;product1&amp;#39;&amp;nbsp;has&amp;nbsp;8&amp;nbsp;items
Biggest&amp;nbsp;&amp;nbsp;&amp;nbsp;hash&amp;nbsp;found&amp;nbsp;&amp;#39;dtemp&amp;#39;&amp;nbsp;has&amp;nbsp;5&amp;nbsp;fields
Biggest&amp;nbsp;string&amp;nbsp;found&amp;nbsp;&amp;#39;page2&amp;#39;&amp;nbsp;has&amp;nbsp;28&amp;nbsp;bytes
Biggest&amp;nbsp;stream&amp;nbsp;found&amp;nbsp;&amp;#39;mqstream&amp;#39;&amp;nbsp;has&amp;nbsp;4&amp;nbsp;entries
Biggest&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set&amp;nbsp;found&amp;nbsp;&amp;#39;userid&amp;#39;&amp;nbsp;has&amp;nbsp;5&amp;nbsp;members
Biggest&amp;nbsp;&amp;nbsp;&amp;nbsp;zset&amp;nbsp;found&amp;nbsp;&amp;#39;device:temperature&amp;#39;&amp;nbsp;has&amp;nbsp;6&amp;nbsp;members

//统计每种数据类型的总键值个数，占所有键值个数的比例，以及平均大小
4&amp;nbsp;lists&amp;nbsp;with&amp;nbsp;15&amp;nbsp;items&amp;nbsp;(12.50%&amp;nbsp;of&amp;nbsp;keys,&amp;nbsp;avg&amp;nbsp;size&amp;nbsp;3.75)
5&amp;nbsp;hashs&amp;nbsp;with&amp;nbsp;14&amp;nbsp;fields&amp;nbsp;(15.62%&amp;nbsp;of&amp;nbsp;keys,&amp;nbsp;avg&amp;nbsp;size&amp;nbsp;2.80)
10&amp;nbsp;strings&amp;nbsp;with&amp;nbsp;68&amp;nbsp;bytes&amp;nbsp;(31.25%&amp;nbsp;of&amp;nbsp;keys,&amp;nbsp;avg&amp;nbsp;size&amp;nbsp;6.80)
1&amp;nbsp;streams&amp;nbsp;with&amp;nbsp;4&amp;nbsp;entries&amp;nbsp;(03.12%&amp;nbsp;of&amp;nbsp;keys,&amp;nbsp;avg&amp;nbsp;size&amp;nbsp;4.00)
7&amp;nbsp;sets&amp;nbsp;with&amp;nbsp;19&amp;nbsp;members&amp;nbsp;(21.88%&amp;nbsp;of&amp;nbsp;keys,&amp;nbsp;avg&amp;nbsp;size&amp;nbsp;2.71)
5&amp;nbsp;zsets&amp;nbsp;with&amp;nbsp;17&amp;nbsp;members&amp;nbsp;(15.62%&amp;nbsp;of&amp;nbsp;keys,&amp;nbsp;avg&amp;nbsp;size&amp;nbsp;3.40)&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;·&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;--latency：检查redis服务的网络延迟，可以用来查看Redis延迟峰值，分析性能问题&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;·&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;--latency-histrory：以15秒为间隔显示多条网络延迟信息&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush: bash;auto-links: false;&quot;&gt;redis-cli&amp;nbsp;--latency-histrory&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;·&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;--stat：实时获取redis重要统计信息，虽然统计信息没有info全面，但是能实时看到增量变化&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; background-color: #FFFF00;&quot;&gt;&lt;strong style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;·&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;--raw&lt;/span&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;background-color: #FFE500;&quot;&gt;&lt;/span&gt;：将返回的数据格式化再输出，常用于显示包含中文的Key，当key包含了中文时，登陆Redis增加该选项就可以正确获取到中文，否则是二进制格式&lt;/span&gt;&lt;/p&gt;&lt;h2 style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;三、Redis 管理命令&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;·&amp;nbsp;&lt;span style=&quot;text-wrap-mode: wrap; font-family: &amp;quot;&amp;quot;; font-size: 16px; background-color: #FFFF00;&quot;&gt;keys&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;span style=&quot;text-wrap-mode: wrap; font-family: &amp;quot;&amp;quot;; font-size: 16px; background-color: #FFFF00;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;text-wrap-mode: wrap; font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;span style=&quot;background-color: #FFE500;&quot;&gt;&lt;/span&gt;：列出符合匹配条件的key，支持通配符，如&lt;span style=&quot;background-color: #FFFFFF;&quot;&gt;keys *&lt;/span&gt;，但是需要注意如果Key数量特别多的话会导致服务阻塞，&lt;span style=&quot;background-color: #FFFF00;&quot;&gt;建议在从节点执行或者使用scan命令&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: wrap; font-family: &amp;quot;&amp;quot;; font-size: 16px; background-color: #FFFF00;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;·&amp;nbsp;&lt;/span&gt;t&lt;span style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;ype&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-size: 16px; font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;：查看指定key的类型，比如是string还是hash&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;·&amp;nbsp;&lt;/span&gt;exists&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;：查看&lt;span style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;指定&lt;/span&gt;key是否存在，存在返回1，否则为0&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;·&amp;nbsp;&lt;/span&gt;randomkey&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;：返回一个随机Key&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;·&amp;nbsp;&lt;/span&gt;ttl&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;：查看指定Key的有效期，-1代表不过期，-2代表键不存在，其他数字代表距离过期秒数&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush: bash;auto-links: false;&quot;&gt;ttl&amp;nbsp;name&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;·&amp;nbsp;&lt;/span&gt;expire / expireat&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;：设置指定Key的有效期，单位为秒，&lt;span style=&quot;background-color: #FFFF00;&quot;&gt;expireat为时间戳格式&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush: bash;auto-links: false;&quot;&gt;expire&amp;nbsp;name&amp;nbsp;100&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;·&amp;nbsp;&lt;/span&gt;persist&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;：设置指定Key永不过期&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush: bash;auto-links: false;&quot;&gt;persist&amp;nbsp;name&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;·&amp;nbsp;&lt;/span&gt;del&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;：删除一个或多个key，返回的值是成功删除的个数，如果删除的键不存在返回0。删除Bigkey会有阻塞风险&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush: bash;auto-links: false;&quot;&gt;del&amp;nbsp;key1&amp;nbsp;key2&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;background-color: #FFFFFF;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;strong style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px; background-color: #FFFFFF;&quot;&gt;·&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;renamenx：修改key的名字，只不过新的key名必须是不存在的才可以，避免覆盖已有的key&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px; background-color: #FFFF00;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;·&amp;nbsp;&lt;/span&gt;unlink&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;span style=&quot;background-color: #FFE500;&quot;&gt;&lt;/span&gt;：4.0以上版本所支持新的删除Key方法，不会有阻塞问题&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;·&amp;nbsp;&lt;/span&gt;rename&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;：修改key的名字&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush: bash;auto-links: false;&quot;&gt;rename&amp;nbsp;oldkey&amp;nbsp;newkey&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;· 命令别名：&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;Redis提供了&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px; background-color: #FFFF00;&quot;&gt;命令别名&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;的功能，可以把默认命名修改或禁用以增强安全性，如果发现命令无法执行需要检查配置文件中是否配置了命令别名&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#将FLUSHALL命令禁用
rename-command&amp;nbsp;FLUSHALL&amp;nbsp;&amp;quot;&amp;quot;&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;strong style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;·&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;ping&lt;/strong&gt;：查看服务是否正常连接，如果正常的话会返回一个pong的输出&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;strong style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;·&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;select&lt;/strong&gt;：选择指定编号的数据库。Redis提供了0-15号数据库，默认是0，但是不推荐使用多个数据库来区分业务，真有这种需求的话考虑多实例更好&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;select&amp;nbsp;1&amp;nbsp;&amp;nbsp;#选择1号数据库&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px; background-color: #FFFF00;&quot;&gt;&lt;strong style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;·&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;info&lt;/strong&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;span style=&quot;background-color: #FFE500;&quot;&gt;&lt;/span&gt;：获取服务相关统计信息，如Redis版本的查看，占用的内存等，和keys命令一样可以通配符&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px; background-color: #FFFF00;&quot;&gt;&lt;strong style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;·&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;memory usage&lt;/strong&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;：4.0开始支持，用于查看制定key占用的内存，单位是字节&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;memory&amp;nbsp;usage&amp;nbsp;test_key&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px; background-color: #FFFF00;&quot;&gt;&lt;strong style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;·&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;client list&lt;/strong&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;：查看已连接的客户端&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px; background-color: #FFFF00;&quot;&gt;&lt;strong style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;·&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;config&amp;nbsp;get&lt;/strong&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;span style=&quot;background-color: #FFE500;&quot;&gt;&lt;/span&gt;：根据匹配条件查看服务配置信息，支持通配符&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;config&amp;nbsp;get&amp;nbsp;timeout&amp;nbsp;&amp;nbsp;#查看配置文件中timeout相关信息
config&amp;nbsp;get&amp;nbsp;requ*&amp;nbsp;&amp;nbsp;#查看requ开头的配置项&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; background-color: #FFFF00;&quot;&gt;&lt;strong style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;·&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&amp;nbsp;&lt;/span&gt;config&amp;nbsp;set&lt;/strong&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 16px; background-color: #FFFFFF;&quot;&gt;：在线修改redis配置，结合config&amp;nbsp;rewrite可以实现不重启服务而修改配置&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;config&amp;nbsp;set&amp;nbsp;maxmemory&amp;nbsp;1gb&amp;nbsp;&amp;nbsp;#在线修改内存大小，支持各种单位&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px; background-color: #FFFF00;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;·&amp;nbsp;&lt;/span&gt;config&amp;nbsp;rewrite&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-size: 16px; background-color: #FFFFFF;&quot;&gt;：将在线配置写入到配置文件，不用重启服务&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#在线修改redis最大内存
127.0.0.1:6379&amp;gt;&amp;nbsp;config&amp;nbsp;get&amp;nbsp;maxmemory
1)&amp;nbsp;&amp;quot;maxmemory&amp;quot;
2)&amp;nbsp;&amp;quot;24000000000&amp;quot;
127.0.0.1:6379&amp;gt;&amp;nbsp;config&amp;nbsp;set&amp;nbsp;maxmemory&amp;nbsp;26000000000
OK
127.0.0.1:6379&amp;gt;&amp;nbsp;config&amp;nbsp;get&amp;nbsp;maxmemory
1)&amp;nbsp;&amp;quot;maxmemory&amp;quot;
2)&amp;nbsp;&amp;quot;26000000000&amp;quot;
127.0.0.1:6379&amp;gt;&amp;nbsp;config&amp;nbsp;rewrite
OK&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px; background-color: #FFFF00;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;·&amp;nbsp;&lt;/span&gt;flushdb&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;span style=&quot;background-color: #FFE500;&quot;&gt;&lt;/span&gt;：删除当前选中库中的所有key，数据量大的时候有阻塞风险&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px; background-color: #FFFF00;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;·&amp;nbsp;&lt;/span&gt;flushall&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;：删除所有库中的所有key&lt;span style=&quot;font-family: &amp;quot;font-size:16px;&amp;quot;;&quot;&gt;，数据量大的时候有阻塞风险&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;·&amp;nbsp;&lt;/span&gt;dbsize&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;：返回当前库中key的数量&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;·&amp;nbsp;&lt;/span&gt;save&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;：将redis数据持久化存储到rdb文件，由于是前台运行会产生阻塞&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;·&amp;nbsp;&lt;/span&gt;bgsave&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;：开启子现成进行数据持久化，不会阻塞&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;·&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&amp;nbsp;&lt;/span&gt;shutdown&lt;/strong&gt;：优雅关闭redis&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;redis-cli&amp;nbsp;-a&amp;nbsp;123456&amp;nbsp;-h&amp;nbsp;127.0.0.1&amp;nbsp;shutdown&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2 style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;&amp;quot;; font-size: 16px;&quot;&gt;四、Redis 数据操作命令&lt;/span&gt;&lt;/h2&gt;&lt;h3&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;字符串&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;· set&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;：创建Key并赋值，区分大小写，可以非交互写入&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;set&amp;nbsp;site&amp;nbsp;ywpie.com&amp;nbsp;#设置一个key，名为“site”，值为ywpie.com
redis-cli&amp;nbsp;-h&amp;nbsp;192.168.100.10&amp;nbsp;-p&amp;nbsp;6379&amp;nbsp;set&amp;nbsp;name&amp;nbsp;tom&amp;nbsp;&amp;nbsp;#非交互式设置或读取key&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;· get&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;：获取指定Key的值&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;get&amp;nbsp;site&amp;nbsp;&amp;nbsp;#获取之前设置的“site”的值&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;· setnx&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;： &lt;span style=&quot;font-size: 16px;&quot;&gt;创建Key并赋值&lt;/span&gt;，但是会先判断该Key是否已经存在，已存在返回0失败，避免覆盖已有数据&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;· setex&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;：给某个key设置一个值，并且指定一个有效期&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;setex&amp;nbsp;name&amp;nbsp;10&amp;nbsp;tanglu&amp;nbsp;&amp;nbsp;#10秒过期&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;· getset&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;：获取一个key的旧值，并赋予新值&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;getset&amp;nbsp;name&amp;nbsp;tom&amp;nbsp;&amp;nbsp;#如name旧值为jerry，那么会打印出来，并且重新设置为to&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;· mset / mget&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;：批量设置和获取多个key，命令复杂度属于O(N)，如果获取的元素个数不是特别多的话可以使用，通过批量操作节约网络带宽。该操作属于原子性操作，在批量设置key时如果有一个key失败，整个操作都会失败&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;mset&amp;nbsp;name1&amp;nbsp;tom&amp;nbsp;name2&amp;nbsp;jerry&amp;nbsp;name3&amp;nbsp;john&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;· incr / decr&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;：对指定整数型的Key进行自增自减，应用场景比如微博转发增加次数&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;· incrby / decrby&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;：对指定整数型的Key进行指定数值的增加或减少&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;Hash&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;· hset&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;：设置Redis Hash Key&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;hset&amp;nbsp;key&amp;nbsp;field&amp;nbsp;value
#&amp;nbsp;hsetnx&amp;nbsp;key&amp;nbsp;field&amp;nbsp;value
#&amp;nbsp;hmset&amp;nbsp;key&amp;nbsp;field1&amp;nbsp;value1&amp;nbsp;field2&amp;nbsp;value2
hset&amp;nbsp;student1&amp;nbsp;name&amp;nbsp;tanglu&amp;nbsp;age&amp;nbsp;30&amp;nbsp;&amp;nbsp;#设置一个hash&amp;nbsp;key，名为student1，然后添加了name和age两个字段
hset&amp;nbsp;student1&amp;nbsp;sex&amp;nbsp;male&amp;nbsp;&amp;nbsp;#新增一个sex字段，值位male
hmset&amp;nbsp;student1&amp;nbsp;height&amp;nbsp;175&amp;nbsp;weight&amp;nbsp;70&amp;nbsp;&amp;nbsp;#一次新增多个字段&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;· hlen&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;：获取Redis Hash Key元素个数&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;hlen&amp;nbsp;key
hlen&amp;nbsp;tanglu&amp;nbsp;&amp;nbsp;#显示结果为4，因为上面示例设置了age&amp;nbsp;sex&amp;nbsp;height&amp;nbsp;weight一共4个字段&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;· hget&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;：&lt;span style=&quot;font-size: 16px;&quot;&gt;获取指定字段的值，get的时候必须写清楚表名和字段名&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;hmget&amp;nbsp;key&amp;nbsp;field1&amp;nbsp;field2&amp;nbsp;&amp;nbsp;#获取多个值
hget&amp;nbsp;student1&amp;nbsp;name&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;· hgetall&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;：获取Hash Key所有字段的值，同keys命令一样需谨慎使用&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;hgetall&amp;nbsp;key&amp;nbsp;&amp;nbsp;#显示出该Hash类型的key下的所有字段和值，谨慎使用
hkeys&amp;nbsp;key&amp;nbsp;&amp;nbsp;#仅显示该Hash类型的key下的所有字段
hvals&amp;nbsp;key&amp;nbsp;&amp;nbsp;#和上一步相反，显示的是具体的值&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;· hdel&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;：删除Hash Key中指定的字段和值&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;hdel&amp;nbsp;key&amp;nbsp;field1&amp;nbsp;field2...&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;· hexists&lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;：判断Hash Key字段是否存在，返回1代表存在，0代表不存在&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;hexists&amp;nbsp;key&amp;nbsp;field&amp;nbsp;&amp;nbsp;#一次只能跟一个字段
hexists&amp;nbsp;student1&amp;nbsp;address&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap; font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;无序集合&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;sadd&amp;nbsp;ages&amp;nbsp;25
sadd&amp;nbsp;ages&amp;nbsp;30
sadd&amp;nbsp;ages&amp;nbsp;32
sadd&amp;nbsp;ages&amp;nbsp;25&amp;nbsp;&amp;nbsp;#重复定义，会添加失败
smembers&amp;nbsp;ages&amp;nbsp;&amp;nbsp;#显示集合中的元素，由于是无序的，不用再指定序号
srem&amp;nbsp;ages&amp;nbsp;25&amp;nbsp;&amp;nbsp;#移除一个元素
sismember&amp;nbsp;ages&amp;nbsp;30&amp;nbsp;&amp;nbsp;#检查集合中有没有30这个元素&lt;/pre&gt;&lt;h3 style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;集合&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;zadd&amp;nbsp;students_top3&amp;nbsp;tanglu&amp;nbsp;100&amp;nbsp;zhangsan&amp;nbsp;90&amp;nbsp;lisi&amp;nbsp;85&amp;nbsp;&amp;nbsp;&amp;nbsp;
zrange&amp;nbsp;students_top3&amp;nbsp;0&amp;nbsp;-1&amp;nbsp;&amp;nbsp;#会根据评分对成员自动排序&amp;nbsp;
zrank&amp;nbsp;students_top3&amp;nbsp;tanglu&amp;nbsp;&amp;nbsp;#返回1，因为分数排名第一&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;GEO&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#设置2个包含经纬度的key
geoadd&amp;nbsp;site&amp;nbsp;116.404269&amp;nbsp;39.913411&amp;nbsp;tiananmen&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#设置了tiananmeng的经纬度
geoadd&amp;nbsp;site&amp;nbsp;116.36&amp;nbsp;39.922461&amp;nbsp;&amp;nbsp;yuetangongyuan

#查询
geopos&amp;nbsp;site&amp;nbsp;tiananmen

#距离计算，可选m或km等单位
geodist&amp;nbsp;site&amp;nbsp;tiananmen&amp;nbsp;yuetangongyuan&amp;nbsp;km&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;列表&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;lpush&amp;nbsp;names&amp;nbsp;tanglu&amp;nbsp;&amp;nbsp;#从左边开始插入数据
lpush&amp;nbsp;names&amp;nbsp;tom
lpush&amp;nbsp;names&amp;nbsp;tanglu&amp;nbsp;&amp;nbsp;#故意定义了重复的value
lrange&amp;nbsp;names&amp;nbsp;0&amp;nbsp;-1&amp;nbsp;&amp;nbsp;#获取列表里的全部值，0和-1是起始和结束范围，后进入的key的值反而是在前面的
lrange&amp;nbsp;names&amp;nbsp;0&amp;nbsp;1&amp;nbsp;&amp;nbsp;#获取第一个和第二个值
lrem&amp;nbsp;names&amp;nbsp;1&amp;nbsp;tanglu&amp;nbsp;&amp;nbsp;#移除一个值为tanglu的列，这里将会按照序号移除。如果要移除所有的话，序号写0
lpop&amp;nbsp;names&amp;nbsp;&amp;nbsp;#按照后进先出的方式读取列表里的数据，可当做消息队列
rpop&amp;nbsp;names&amp;nbsp;&amp;nbsp;#先进先出
del&amp;nbsp;names&amp;nbsp;&amp;nbsp;#删除列表

blpop&amp;nbsp;&amp;nbsp;&amp;nbsp;#lpop的阻塞版本，当给定列表内没有任何元素可供弹出的时候，连接将被阻塞，直到有另一个客户端对该key执行LPUSH或RPUSH&lt;/pre&gt;&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;a target=&quot;_blank&quot; href=&quot;https://www.ywdba.cn/content/uploadfile/201803/c9fd1522406907.jpg&quot; id=&quot;ematt:1098&quot;&gt;&lt;/a&gt;&lt;/p&gt;</description><pubDate>Tue, 03 Feb 2026 11:30:37 +0800</pubDate></item><item><title>【操作系统】LVM的组建与挂载教程</title><link>https://ywpie.com/post/73.html</link><description>&lt;h2&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;一、背景&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;在当前业务环境中，为了满足对大容量存储的需求并提升磁盘空间的统一管理能力，计划将服务器中可用的 12 块裸盘（sda~sdl）通过 LVM 的方式&lt;span style=&quot;font-size: 16px; text-wrap-mode: wrap;&quot;&gt;整合为一个逻辑卷（LVM）&lt;/span&gt;，通过把多块物理磁盘组合成一个统一的逻辑存储池，实现简化容量管理、提升扩容灵活性的目的。本次操作&lt;/span&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;会清空目标磁盘上的所有数据，因此在执行前需确认磁盘中无重要数据或已完成备份&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;二、LVM创建和挂载步骤&lt;/span&gt;&lt;/h2&gt;&lt;h3&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;1、查看磁盘信息&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;通过lsblk命令查看当前操作系统中磁盘信息，可以看到这12块盘当前都没有挂载使用，没有MOUNTPOINT信息&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;[root@k2data-41&amp;nbsp;~]#&amp;nbsp;lsblk
NAME&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MAJ:MIN&amp;nbsp;RM&amp;nbsp;&amp;nbsp;&amp;nbsp;SIZE&amp;nbsp;RO&amp;nbsp;TYPE&amp;nbsp;MOUNTPOINT
sda&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8:0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;&amp;nbsp;7.3T&amp;nbsp;&amp;nbsp;0&amp;nbsp;disk&amp;nbsp;
sdb&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8:16&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;&amp;nbsp;7.3T&amp;nbsp;&amp;nbsp;0&amp;nbsp;disk&amp;nbsp;
sdc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8:32&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;&amp;nbsp;7.3T&amp;nbsp;&amp;nbsp;0&amp;nbsp;disk&amp;nbsp;
sdd&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8:48&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;&amp;nbsp;7.3T&amp;nbsp;&amp;nbsp;0&amp;nbsp;disk&amp;nbsp;
sde&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8:64&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;&amp;nbsp;7.3T&amp;nbsp;&amp;nbsp;0&amp;nbsp;disk&amp;nbsp;
sdf&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8:80&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;&amp;nbsp;7.3T&amp;nbsp;&amp;nbsp;0&amp;nbsp;disk&amp;nbsp;
sdg&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8:96&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;&amp;nbsp;7.3T&amp;nbsp;&amp;nbsp;0&amp;nbsp;disk&amp;nbsp;
sdh&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8:112&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;&amp;nbsp;7.3T&amp;nbsp;&amp;nbsp;0&amp;nbsp;disk&amp;nbsp;
sdi&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8:128&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;&amp;nbsp;7.3T&amp;nbsp;&amp;nbsp;0&amp;nbsp;disk&amp;nbsp;
sdj&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8:144&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;&amp;nbsp;7.3T&amp;nbsp;&amp;nbsp;0&amp;nbsp;disk&amp;nbsp;
sdk&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8:160&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;&amp;nbsp;7.3T&amp;nbsp;&amp;nbsp;0&amp;nbsp;disk&amp;nbsp;
sdl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8:176&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;&amp;nbsp;7.3T&amp;nbsp;&amp;nbsp;0&amp;nbsp;disk&lt;/pre&gt;&lt;h3&gt;2、&lt;span style=&quot;font-size: 16px;&quot;&gt;创建 Physical Volume（PV）&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;通过pvcreate命令将12块磁盘创建为物理卷，即PV&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;[root@k2data-41&amp;nbsp;~]#&amp;nbsp;pvcreate&amp;nbsp;/dev/sda&amp;nbsp;/dev/sdb&amp;nbsp;/dev/sdc&amp;nbsp;/dev/sdd&amp;nbsp;/dev/sde&amp;nbsp;/dev/sdf&amp;nbsp;/dev/sdg&amp;nbsp;/dev/sdh&amp;nbsp;/dev/sdi&amp;nbsp;/dev/sdj&amp;nbsp;/dev/sdk&amp;nbsp;/dev/sdl
&amp;nbsp;&amp;nbsp;Physical&amp;nbsp;volume&amp;nbsp;&amp;quot;/dev/sda&amp;quot;&amp;nbsp;successfully&amp;nbsp;created.
&amp;nbsp;&amp;nbsp;Physical&amp;nbsp;volume&amp;nbsp;&amp;quot;/dev/sdb&amp;quot;&amp;nbsp;successfully&amp;nbsp;created.
&amp;nbsp;&amp;nbsp;Physical&amp;nbsp;volume&amp;nbsp;&amp;quot;/dev/sdc&amp;quot;&amp;nbsp;successfully&amp;nbsp;created.
&amp;nbsp;&amp;nbsp;Physical&amp;nbsp;volume&amp;nbsp;&amp;quot;/dev/sdd&amp;quot;&amp;nbsp;successfully&amp;nbsp;created.
&amp;nbsp;&amp;nbsp;Physical&amp;nbsp;volume&amp;nbsp;&amp;quot;/dev/sde&amp;quot;&amp;nbsp;successfully&amp;nbsp;created.
&amp;nbsp;&amp;nbsp;Physical&amp;nbsp;volume&amp;nbsp;&amp;quot;/dev/sdf&amp;quot;&amp;nbsp;successfully&amp;nbsp;created.
&amp;nbsp;&amp;nbsp;Physical&amp;nbsp;volume&amp;nbsp;&amp;quot;/dev/sdg&amp;quot;&amp;nbsp;successfully&amp;nbsp;created.
&amp;nbsp;&amp;nbsp;Physical&amp;nbsp;volume&amp;nbsp;&amp;quot;/dev/sdh&amp;quot;&amp;nbsp;successfully&amp;nbsp;created.
&amp;nbsp;&amp;nbsp;Physical&amp;nbsp;volume&amp;nbsp;&amp;quot;/dev/sdi&amp;quot;&amp;nbsp;successfully&amp;nbsp;created.
&amp;nbsp;&amp;nbsp;Physical&amp;nbsp;volume&amp;nbsp;&amp;quot;/dev/sdj&amp;quot;&amp;nbsp;successfully&amp;nbsp;created.
&amp;nbsp;&amp;nbsp;Physical&amp;nbsp;volume&amp;nbsp;&amp;quot;/dev/sdk&amp;quot;&amp;nbsp;successfully&amp;nbsp;created.
&amp;nbsp;&amp;nbsp;Physical&amp;nbsp;volume&amp;nbsp;&amp;quot;/dev/sdl&amp;quot;&amp;nbsp;successfully&amp;nbsp;created.
&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;
[root@k2data-41&amp;nbsp;~]#&amp;nbsp;pvs
&amp;nbsp;&amp;nbsp;PV&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VG&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Fmt&amp;nbsp;&amp;nbsp;Attr&amp;nbsp;PSize&amp;nbsp;&amp;nbsp;PFree&amp;nbsp;
&amp;nbsp;&amp;nbsp;/dev/sda&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lvm2&amp;nbsp;---&amp;nbsp;&amp;nbsp;&amp;lt;7.28t&amp;nbsp;&amp;lt;7.28t
&amp;nbsp;&amp;nbsp;/dev/sdb&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lvm2&amp;nbsp;---&amp;nbsp;&amp;nbsp;&amp;lt;7.28t&amp;nbsp;&amp;lt;7.28t
&amp;nbsp;&amp;nbsp;/dev/sdc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lvm2&amp;nbsp;---&amp;nbsp;&amp;nbsp;&amp;lt;7.28t&amp;nbsp;&amp;lt;7.28t
&amp;nbsp;&amp;nbsp;/dev/sdd&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lvm2&amp;nbsp;---&amp;nbsp;&amp;nbsp;&amp;lt;7.28t&amp;nbsp;&amp;lt;7.28t
&amp;nbsp;&amp;nbsp;/dev/sde&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lvm2&amp;nbsp;---&amp;nbsp;&amp;nbsp;&amp;lt;7.28t&amp;nbsp;&amp;lt;7.28t
&amp;nbsp;&amp;nbsp;/dev/sdf&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lvm2&amp;nbsp;---&amp;nbsp;&amp;nbsp;&amp;lt;7.28t&amp;nbsp;&amp;lt;7.28t
&amp;nbsp;&amp;nbsp;/dev/sdg&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lvm2&amp;nbsp;---&amp;nbsp;&amp;nbsp;&amp;lt;7.28t&amp;nbsp;&amp;lt;7.28t
&amp;nbsp;&amp;nbsp;/dev/sdh&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lvm2&amp;nbsp;---&amp;nbsp;&amp;nbsp;&amp;lt;7.28t&amp;nbsp;&amp;lt;7.28t
&amp;nbsp;&amp;nbsp;/dev/sdi&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lvm2&amp;nbsp;---&amp;nbsp;&amp;nbsp;&amp;lt;7.28t&amp;nbsp;&amp;lt;7.28t
&amp;nbsp;&amp;nbsp;/dev/sdj&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lvm2&amp;nbsp;---&amp;nbsp;&amp;nbsp;&amp;lt;7.28t&amp;nbsp;&amp;lt;7.28t
&amp;nbsp;&amp;nbsp;/dev/sdk&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lvm2&amp;nbsp;---&amp;nbsp;&amp;nbsp;&amp;lt;7.28t&amp;nbsp;&amp;lt;7.28t
&amp;nbsp;&amp;nbsp;/dev/sdl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lvm2&amp;nbsp;---&amp;nbsp;&amp;nbsp;&amp;lt;7.28t&amp;nbsp;&amp;lt;7.28t&lt;/pre&gt;&lt;h3&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;3、创建 Volume Group（VG）&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;将12个物理卷组成物理卷组，即VG，并命名为 vg_data&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;[root@k2data-41&amp;nbsp;~]#&amp;nbsp;vgcreate&amp;nbsp;vg_data&amp;nbsp;/dev/sda&amp;nbsp;/dev/sdb&amp;nbsp;/dev/sdc&amp;nbsp;/dev/sdd&amp;nbsp;/dev/sde&amp;nbsp;/dev/sdf&amp;nbsp;/dev/sdg&amp;nbsp;/dev/sdh&amp;nbsp;/dev/sdi&amp;nbsp;/dev/sdj&amp;nbsp;/dev/sdk&amp;nbsp;/dev/sdl
&amp;nbsp;&amp;nbsp;Volume&amp;nbsp;group&amp;nbsp;&amp;quot;vg_data&amp;quot;&amp;nbsp;successfully&amp;nbsp;created
&amp;nbsp;&amp;nbsp;
[root@k2data-41&amp;nbsp;~]#&amp;nbsp;vgs
VG&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#PV&amp;nbsp;#LV&amp;nbsp;#SN&amp;nbsp;Attr&amp;nbsp;&amp;nbsp;&amp;nbsp;VSize&amp;nbsp;&amp;nbsp;&amp;nbsp;VFree&amp;nbsp;&amp;nbsp;
centos&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;3&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;wz--n-&amp;nbsp;&amp;nbsp;&amp;lt;1.63t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#之前的卷组信息
vg_data&amp;nbsp;&amp;nbsp;12&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;wz--n-&amp;nbsp;&amp;lt;87.33t&amp;nbsp;&amp;lt;87.33t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#刚创建的卷组信息&lt;/pre&gt;&lt;h3&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;/span&gt;4、&lt;span style=&quot;font-size: 16px;&quot;&gt;创建 Logical Volume（LV）&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;创建一个逻辑卷&lt;span style=&quot;font-size: 16px; text-wrap-mode: wrap;&quot;&gt;lv_data&lt;/span&gt;，并且将刚才物理卷组的全部空间都分配给该逻辑卷&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;[root@k2data-41&amp;nbsp;~]#&amp;nbsp;lvcreate&amp;nbsp;-l&amp;nbsp;100%FREE&amp;nbsp;-n&amp;nbsp;lv_data&amp;nbsp;vg_data
&amp;nbsp;&amp;nbsp;Logical&amp;nbsp;volume&amp;nbsp;&amp;quot;lv_data&amp;quot;&amp;nbsp;created.
&amp;nbsp;&amp;nbsp;
[root@k2data-41&amp;nbsp;~]#&amp;nbsp;lvs
&amp;nbsp;&amp;nbsp;LV&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VG&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Attr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LSize&amp;nbsp;&amp;nbsp;&amp;nbsp;Pool&amp;nbsp;Origin&amp;nbsp;Data%&amp;nbsp;&amp;nbsp;Meta%&amp;nbsp;&amp;nbsp;Move&amp;nbsp;Log&amp;nbsp;Cpy%Sync&amp;nbsp;Convert
&amp;nbsp;&amp;nbsp;home&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;centos&amp;nbsp;&amp;nbsp;-wi-ao----&amp;nbsp;100.00g&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;centos&amp;nbsp;&amp;nbsp;-wi-ao----&amp;nbsp;&amp;nbsp;&amp;nbsp;1.52t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;swap&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;centos&amp;nbsp;&amp;nbsp;-wi-a-----&amp;nbsp;&amp;nbsp;&amp;nbsp;4.00g&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;lv_data&amp;nbsp;vg_data&amp;nbsp;-wi-a-----&amp;nbsp;&amp;lt;87.33t&lt;/pre&gt;&lt;h3&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;5、格式化 LV&lt;/span&gt;&lt;/h3&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;[root@k2data-41&amp;nbsp;~]#&amp;nbsp;mkfs.xfs&amp;nbsp;/dev/vg_data/lv_data
meta-data=/dev/vg_data/lv_data&amp;nbsp;&amp;nbsp;&amp;nbsp;isize=512&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;agcount=88,&amp;nbsp;agsize=268435455&amp;nbsp;blks
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sectsz=4096&amp;nbsp;&amp;nbsp;attr=2,&amp;nbsp;projid32bit=1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;crc=1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;finobt=0,&amp;nbsp;sparse=0
data&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bsize=4096&amp;nbsp;&amp;nbsp;&amp;nbsp;blocks=23442075648,&amp;nbsp;imaxpct=1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sunit=0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;swidth=0&amp;nbsp;blks
naming&amp;nbsp;&amp;nbsp;&amp;nbsp;=version&amp;nbsp;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bsize=4096&amp;nbsp;&amp;nbsp;&amp;nbsp;ascii-ci=0&amp;nbsp;ftype=1
log&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=internal&amp;nbsp;log&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bsize=4096&amp;nbsp;&amp;nbsp;&amp;nbsp;blocks=521728,&amp;nbsp;version=2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sectsz=4096&amp;nbsp;&amp;nbsp;sunit=1&amp;nbsp;blks,&amp;nbsp;lazy-count=1
realtime&amp;nbsp;=none&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;extsz=4096&amp;nbsp;&amp;nbsp;&amp;nbsp;blocks=0,&amp;nbsp;rtextents=0&lt;/pre&gt;&lt;h3&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;6、挂载分区&lt;/span&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/h3&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;mkdir&amp;nbsp;&amp;nbsp;/data
mount&amp;nbsp;/dev/vg_data/lv_data&amp;nbsp;/data&lt;/pre&gt;&lt;h3&gt;7、&lt;span style=&quot;font-size: 16px;&quot;&gt;开机自动挂载&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;编辑 /etc/fstab&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;bash&amp;nbsp;-c&amp;nbsp;&amp;#39;echo&amp;nbsp;&amp;quot;/dev/vg_data/lv_data&amp;nbsp;&amp;nbsp;/data&amp;nbsp;&amp;nbsp;xfs&amp;nbsp;&amp;nbsp;defaults&amp;nbsp;&amp;nbsp;0&amp;nbsp;0&amp;quot;&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;/etc/fstab&amp;#39;&lt;/pre&gt;</description><pubDate>Mon, 19 Jan 2026 10:55:19 +0800</pubDate></item><item><title>【MySQL 8.0】MySQL 8.0新特性介绍与升级方法</title><link>https://ywpie.com/post/70.html</link><description>&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong&gt;一、MySQL 8.0主要新特性&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;截至2023年12月，MySQL官方发布的稳定版为8.0.35，另有一个MySQL8.2为创新版，所以暂不做考虑&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;background-color: #FFFF00;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;· 快速新增/删除列&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;虽然 MySQL 在8.0 以前就已经支持通过 Online&amp;nbsp;DDL实现DDL操作不阻塞DML操作，但在对一些大表进行DDL操作时仍然需要等待很长时间，这样就面临从库延时、耗时过久或者因为DDL操作而创建的临时表产生的资源开销问题。在8.0.12版本开始支持了instant add new column特性，在DDL执行过程中不需要修改存储数据，只用修改存储在系统表中的结构，这样就避免了&lt;span style=&quot;font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; background-color: #FFFFFF;&quot;&gt;最耗时的rebuild和apply row log过程，因此效率非常高。&lt;/span&gt;经过实际测试，在同服务器下对一个500W的表进行新增或删除字段操作，MySQL 5.7 耗时接近6分钟，MySQL 8.0.35&amp;nbsp;下仅需要5秒左右&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;background-color: #FFFF00;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;· 自增列持久化&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;在8.0之前的版本中，如果在自增主键AUTO_INCREMENT值大于max(primary key) + 1 的时候重启了服务，会重置AUTO_INCREMENT的值为max(primary key) + 1。如果主键发生过删除行为，并且对主键列有过更新操作，会触发BUG导致主键冲突。而8.0以后AUTO_INCREMENT会进行持久化存储，不管是删除还是更新操作都会记录到文件中，不会再有这种情况&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#5.7&amp;nbsp;BUG复现过程

#t1表有3行数据
select&amp;nbsp;*&amp;nbsp;from&amp;nbsp;t1&amp;nbsp;&amp;nbsp;;
id&amp;nbsp;&amp;nbsp;&amp;nbsp;c1&amp;nbsp;
1&amp;nbsp;&amp;nbsp;&amp;nbsp;test1
2&amp;nbsp;&amp;nbsp;&amp;nbsp;test2
3&amp;nbsp;&amp;nbsp;&amp;nbsp;test3

#此时删除AUTO_INCREMENT为3的数据
delete&amp;nbsp;from&amp;nbsp;t1&amp;nbsp;where&amp;nbsp;id&amp;nbsp;=&amp;nbsp;3;

select&amp;nbsp;*&amp;nbsp;from&amp;nbsp;t1&amp;nbsp;&amp;nbsp;;
id&amp;nbsp;&amp;nbsp;&amp;nbsp;c1&amp;nbsp;
1&amp;nbsp;&amp;nbsp;&amp;nbsp;test1
2&amp;nbsp;&amp;nbsp;&amp;nbsp;test2

#重启服务后插入新数据
insert&amp;nbsp;into&amp;nbsp;t1(c1)&amp;nbsp;values(&amp;#39;test4&amp;#39;)&amp;nbsp;;

#查看新插入的数据，AUTO_INCREMENT将回退为3
select&amp;nbsp;*&amp;nbsp;from&amp;nbsp;t1&amp;nbsp;&amp;nbsp;;
id&amp;nbsp;&amp;nbsp;&amp;nbsp;c1&amp;nbsp;
1&amp;nbsp;&amp;nbsp;&amp;nbsp;test1
2&amp;nbsp;&amp;nbsp;&amp;nbsp;test2
3&amp;nbsp;&amp;nbsp;&amp;nbsp;test4

#手动修改一条数数据，用到了AUTO_INCREMENT为5
update&amp;nbsp;t1&amp;nbsp;set&amp;nbsp;id&amp;nbsp;=&amp;nbsp;5&amp;nbsp;where&amp;nbsp;c1&amp;nbsp;=&amp;nbsp;&amp;quot;test1&amp;quot;;

select&amp;nbsp;*&amp;nbsp;from&amp;nbsp;t1&amp;nbsp;;&amp;nbsp;
id&amp;nbsp;&amp;nbsp;&amp;nbsp;c1&amp;nbsp;
2&amp;nbsp;&amp;nbsp;&amp;nbsp;test2
3&amp;nbsp;&amp;nbsp;&amp;nbsp;test4
5&amp;nbsp;&amp;nbsp;&amp;nbsp;test1

#继续插入数据
insert&amp;nbsp;into&amp;nbsp;t(c1)&amp;nbsp;values(&amp;#39;test5&amp;#39;)&amp;nbsp;;

select&amp;nbsp;*&amp;nbsp;from&amp;nbsp;t1&amp;nbsp;&amp;nbsp;;
id&amp;nbsp;&amp;nbsp;&amp;nbsp;c1&amp;nbsp;
2&amp;nbsp;&amp;nbsp;&amp;nbsp;test2
3&amp;nbsp;&amp;nbsp;&amp;nbsp;test4
4&amp;nbsp;&amp;nbsp;&amp;nbsp;test5
5&amp;nbsp;&amp;nbsp;&amp;nbsp;test1

#继续插入数据会出现主键冲突，因为mysql此时自动生成的AUTO_INCREMENT为5
insert&amp;nbsp;into&amp;nbsp;t(c1)&amp;nbsp;values(&amp;#39;test6&amp;#39;)&amp;nbsp;;&lt;/pre&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong&gt;·&amp;nbsp;&lt;/strong&gt;&lt;span style=&quot;background-color: #FFFF00;&quot;&gt;新增函数索引&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;在MySQL 8.0.13之前的版本中如果在查询中使用了函数，会导致索引失效。而从MySQL 8.0.13开始，支持在索引中使用函数或表达式的值。函数索引基于虚拟列功能实现，该列的值都是通过前面的函数或者表达式计算出来的，当使用函数索引的时候就会使用这个计算后的列作为索引&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#在未创建函数索引的列上使用函数，不会用到索引
EXPLAIN&amp;nbsp;SELECT&amp;nbsp;*&amp;nbsp;FROM&amp;nbsp;`t_audit_info`&amp;nbsp;WHERE&amp;nbsp;DATE(create_time)&amp;nbsp;&amp;gt;&amp;nbsp;&amp;#39;2021-11-21&amp;#39;;

#在t3表的create_time列创建一个使用了DATE函数的索引
ALTER&amp;nbsp;TABLE&amp;nbsp;t3&amp;nbsp;ADD&amp;nbsp;INDEX&amp;nbsp;idx_create_time_func((DATE(create_time)));

#再次执行查询可以使用索引
EXPLAIN&amp;nbsp;SELECT&amp;nbsp;*&amp;nbsp;FROM&amp;nbsp;`t_audit_info`&amp;nbsp;WHERE&amp;nbsp;DATE(create_time)&amp;nbsp;&amp;gt;&amp;nbsp;&amp;#39;2021-11-21&amp;#39;;&lt;/pre&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong&gt;·&amp;nbsp;&lt;/strong&gt;&lt;span style=&quot;background-color: #FFFF00;&quot;&gt;新增降序索引&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;倒叙索引的语法在5.7的时候虽然可以使用，但是不会真正生效，添加索引后再查看表结构会发现依然使用的是升序索引。降序索引从8.0 正式支持使用，&lt;/span&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;在对多个字段进行排序时，不同的字段的排序规则可能不同，通过倒叙索引可以提高反向扫描的效率&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#创建一个包含降序索引的表格
create&amp;nbsp;table&amp;nbsp;t1(
c1&amp;nbsp;int,
c2&amp;nbsp;int,
index&amp;nbsp;idx_c1_c2(c1,c2&amp;nbsp;desc)
);

#下列包含降序查询的语句可以直接使用索引，执行计划中没有using&amp;nbsp;filesort而是using&amp;nbsp;index
select&amp;nbsp;*&amp;nbsp;from&amp;nbsp;t1&amp;nbsp;order&amp;nbsp;by&amp;nbsp;c1,c2&amp;nbsp;desc;&lt;/pre&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong&gt;·&amp;nbsp;&lt;/strong&gt;&lt;span style=&quot;background-color: #FFFF00;&quot;&gt;新增隐藏索引（不可见索引）&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; background-color: #FFFFFF;&quot;&gt;使用invisible关键词可以将索引设置为隐藏索引，查询语句不会使用被隐藏的索引（即便使用force index也不会使用）。该特性一般用于对需要删除的索引进行观察，当索引被隐藏后如果不会对业务带来影响那么就可以正式删除&lt;/span&gt;&lt;span style=&quot;background-color: #FFFFFF; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;，这样可以减少对大表误删索引后再添加带来的性能成本。需要注意的是索引被隐藏后，如果数据发生更新，索引依然会被更新，长期被隐藏的索引一定要记得删除&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;creata&amp;nbsp;table&amp;nbsp;t1(
c1&amp;nbsp;int,
c2&amp;nbsp;int,
index&amp;nbsp;idx_c1(c1),
index&amp;nbsp;idx_c2(c2)&amp;nbsp;invisible
);

#也可以修改原索引不可见
alter&amp;nbsp;table&amp;nbsp;t1&amp;nbsp;alter&amp;nbsp;index&amp;nbsp;idx_c1&amp;nbsp;invisiable;

#不会使用索引
select&amp;nbsp;*&amp;nbsp;from&amp;nbsp;t1&amp;nbsp;where&amp;nbsp;c2=1;&lt;/pre&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;· Innodb存储引擎支持跳过锁等待&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;FOR UPDATE语句支持添加NOWAIT、SKIP LOCKED语句。NOWAIT表示如果查询行已经被加锁，那么直接报错返回，不用等待锁超时；SKIP LOCKED可以跳过被锁的行，返回其他没有锁定的记录&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;select&amp;nbsp;*&amp;nbsp;from&amp;nbsp;t1&amp;nbsp;for&amp;nbsp;update&amp;nbsp;skip&amp;nbsp;locked;&lt;/pre&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;· GROUP BY语句不再进行隐式排序&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;在5.7的时候经过group by的字段会默认进行隐式排序，8.0开始需要显式加上order by字句，这个主要是考虑对其他数据库没有自动隐式排序进行兼容，语法更严谨&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#5.7支持隐式排序时语法
select&amp;nbsp;count(*)&amp;nbsp;from&amp;nbsp;t1&amp;nbsp;group&amp;nbsp;by&amp;nbsp;c2;

#5.7版本结果
count(*)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c2
1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;10
2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;50
1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;80
1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;100

#8.0版本结果
count(*)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c2
1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;10
2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;50
1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;100
1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;80

#8.0开始必须指定order&amp;nbsp;by语句
select&amp;nbsp;count(*)&amp;nbsp;from&amp;nbsp;t1&amp;nbsp;group&amp;nbsp;by&amp;nbsp;c2&amp;nbsp;order&amp;nbsp;by&amp;nbsp;c2;&lt;/pre&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong&gt;· 新增innodb_dedicated_server自适应参数&lt;br/&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;该参数可以让InnoDB根据服务器内存自动调整innodb_buffer_pool、innodb_log_file_size等参数，尽可能的使用内存资源。该参数默认关闭，如果服务器上存在其他组件或者是多实例部署，不建议打开该功能&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;show&amp;nbsp;variables&amp;nbsp;like&amp;nbsp;&amp;#39;%innodb_dedicated_server%&amp;#39;;&lt;/pre&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;· undo文件不再使用系统表空间&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;8.0 将为Undo log默认创建2个单独的表空间，不再使用系统表空间。Undo Log主要存储了回滚数据，是MySQL MVCC机制的根本。在MySQL 8以前这些回滚数据默认存储在了系统表空间ibdata1文件中（在5.7之前甚至无法分离出来）。在有大量并发事务或者大事务未提交的情况下会导致ibdata暴涨的问题，而这部分空间通常只有重启数据库\重建实例才能回收&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://www.ywdba.cn/zb_users/upload/2023/11/202311281701138733257666.jpg&quot; title=&quot;801.jpg&quot; alt=&quot;801.jpg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;· binlog日志过期时间可以精确到秒&lt;br/&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;在8.0之前通过expire_logs_day参数控制binlog的过期时间，8.0开始默认使用更为精确的binlog_expire_logs_seconds参数，expire_logs_day会在未来版本弃用&lt;/span&gt;&lt;/div&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;· DDL事务原子化&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;MySQL 8.0开始支持了更多的数据字典，元数据全部采用InnoDB引擎进行存储，不再存在.frm文件。因此也让&lt;/span&gt;DDL开始支持事务完整性，一个事务中如果提交了多个DDL，它们要么全部成功要么全部回滚，不再出现部分成功的情况&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px; background-color: #FFFF00;&quot;&gt;· 可在线持久化配置&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px; background-color: #FFFFFF;&quot;&gt;MySQL 8.0通过PERSIST命令可以在线修改全局参数并持久化到配置文件中，在线修改的参数会保存到data/mysqld.auto.cnf（该配置文件优先级高于my.cnf），启动MySQL时会从该配置文件拉取配置&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;SET&amp;nbsp;PERSIST&amp;nbsp;innodb_lock_wait_timeout=15;&lt;/pre&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong&gt;· 支持公共表表达式，即WITH语句（CTE，Common Table Expression）&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;可以将复杂的子查询提取出来，主查询中直接使用，降低子查询复杂度&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;WITH&amp;nbsp;cte_name&amp;nbsp;AS&amp;nbsp;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SELECT&amp;nbsp;...
)
SELECT&amp;nbsp;*&amp;nbsp;FROM&amp;nbsp;cte_name;&lt;/pre&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;·&amp;nbsp;支持&lt;/span&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px; background-color: #FFFF00;&quot;&gt;窗口函数和&lt;/span&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;&lt;strong&gt;通用表达式（&lt;/strong&gt;主要用于OLAP场景）&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;窗口函数可以在一组查询行上执行类似于聚合的操作，主要用于OLAP场景，比如处理复杂的报表、统计分析等。相比传统的聚合函数，窗口函数不会修改原有语句的输出结果，而是直接添加新的聚合字段进行展现，可以在不分组的前提下对数据进行聚合计算&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;select&amp;nbsp;name,sum(balance)&amp;nbsp;from&amp;nbsp;account_channel&amp;nbsp;group&amp;nbsp;by&amp;nbsp;name;

#不再需要group&amp;nbsp;by，聚合结果在每一行中展示
select&amp;nbsp;name,channel,balance,sum(balance)&amp;nbsp;over(partition&amp;nbsp;by&amp;nbsp;name)&amp;nbsp;as&amp;nbsp;sum_balance&amp;nbsp;from&amp;nbsp;account_channel;&lt;/pre&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;&amp;nbsp;&lt;img class=&quot;ue-image&quot; src=&quot;https://www.ywdba.cn/zb_users/upload/2023/11/202311281701141787808995.jpg&quot; title=&quot;802.jpg&quot; alt=&quot;802.jpg&quot;/&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;除了上述亮点特性以外，还有以下更新：&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;· 在官方测评中 MySQL 8.0 性能峰值几乎是5.7的两倍&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;· 调整默认字符集为&lt;span style=&quot;background-color: #FFFF00;&quot;&gt;utf8mb4&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;·&amp;nbsp;使用&lt;span style=&quot;background-color: #FFFF00;&quot;&gt;新的密码认证插件caching_sha2_password&lt;/span&gt;（替代原本的mysql_native_password）（客户端需要升级驱动），支持更高的密码策略，即便相同的密码加密后的密文也是不同的&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;·&amp;nbsp;重构SQL分析器，增强优化器和CBO特性&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;·&amp;nbsp;支持使用shutdown命令直接关闭服务&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;·&amp;nbsp;错误日志增加了不同错误的错误编号，方便查询&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;·&amp;nbsp;并行复制writeset机制，提升从库复制性能&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;·&amp;nbsp;支持创建系统级别或者用户级别资源组以限制SQL对服务器资源的占用&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;·&amp;nbsp;新增计算列功能，比如C列的数据是通过A列和B列计算后产生&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;·&amp;nbsp;增加CREATE TABLE ... SELECT的原子性和crash safe支持，解决了MGR架构下无法使用的问题&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;·&amp;nbsp;角色role功能&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;·&amp;nbsp;可并行写入redo log，提升大量事务写入时的性能&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;·&amp;nbsp;可在线调整redo log buffer和undo log相关设置&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;·&amp;nbsp;可针对单个会话SET_VAR设置变量，提升灵活性&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;· 增加&lt;span style=&quot;background-color: #FFFF00;&quot;&gt;部分索引（条件索引）&lt;/span&gt;功能&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong&gt;二、升级8.0前的准备&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;1、先阅读官方What Is New In MySQL 8.0文档，关注被废弃的功能，避免配置文件中依然存在这些历史配置&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;2、需要考虑回滚方案&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;3、通过先升级从库的方式进行平稳过渡&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;4、升级前需要关注是否存在关键词兼容问题以及GROUP BY语句兼容问题，可以使用官方的检查工具&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;mysqlsh&amp;nbsp;root:123456@192.168.1.101:3306&amp;nbsp;-e&amp;nbsp;&amp;quot;util.checkForServerUpgrade();&amp;quot;&lt;/pre&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;5、5.7版本支持直接升级8.0（5.6不支持），升级大版本前建议先把小版本升级到最新&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;6、建议升级方式采用逻辑备份+导入的方式&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;strong&gt;三、升级MySQL 8.0步骤&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;1、关闭当前MySQL&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;2、备份数据&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;3、使用新版本二进制包替换原版本&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;4、更改配置文件&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;5、启动服务，不需要mysql_upgrade，MySQL 8.0支持通过配置upgrade = AUTO参数来自动处理升级需要做的一切&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Tue, 02 Dec 2025 09:11:38 +0800</pubDate></item><item><title>【MySQL 8.0】MySQL5.7升级MySQL8.0的步骤与常见问题</title><link>https://ywpie.com/post/69.html</link><description>&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;一、为什么推荐将MySQL从5.7升级到8.0&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;MySQL5.7的生命周期已经在2023年10月结束，沿用老版本将存在以下问题：&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;· 所有漏洞不再修复，如自增ID回退问题&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;·&amp;nbsp;核心新特性无法使用，如秒级加列、在线持久化配置&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;·&amp;nbsp;生态衰退，如Xtrabackup等工具的使用&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;·&amp;nbsp;后期跨版本升级风险更大&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;二、升级过程中可能出现的问题&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;这里的问题都是实际升级过程中发生的，有代表意义&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;1、注释乱码问题&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;在升级过程中有部分表或字段的注释出现了乱码，原因无法追究，但是乱码会导致升级失败，所以需要先对这部分乱码内容进行修复&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://www.ywdba.cn/zb_users/upload/2024/03/202403191710813837423913.jpg&quot; title=&quot;1.jpg&quot; alt=&quot;1.jpg&quot;/&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px; text-wrap: nowrap;&quot;&gt;2、清理孤儿存储过程&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;在部分实例中发现有存储过程变为了孤儿存储过程（即存储过程所依赖的库表已不存在），这部分存储过程会导致升级失败。&lt;/span&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px; text-wrap: nowrap;&quot;&gt;在正式升级前，需对存储过程进行梳理，清理无用的存储过程&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#查看存储过程
SHOW&amp;nbsp;PROCEDURE&amp;nbsp;STATUS;

#删除无用的存储过程
DROP&amp;nbsp;PROCEDURE&amp;nbsp;your_database_name.your_procedure_name;

#部分存储过程无法直接通过SHOW命令查询，可以通过特殊方式删除
SELECT&amp;nbsp;*&amp;nbsp;FROM&amp;nbsp;mysql.proc&amp;nbsp;WHERE&amp;nbsp;db&amp;nbsp;=&amp;nbsp;&amp;#39;your_database_name&amp;#39;;
DELETE&amp;nbsp;FROM&amp;nbsp;mysql.proc&amp;nbsp;WHERE&amp;nbsp;db&amp;nbsp;=&amp;nbsp;&amp;#39;your_database_name&amp;#39;&amp;nbsp;AND&amp;nbsp;NAME&amp;nbsp;=&amp;nbsp;&amp;#39;your_procedure_name&amp;#39;;&lt;/pre&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;3、用户认证插件选择问题&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;新版本数据库中默认的用户认证插件为caching_sha2_password，相比早期的mysql_native_password插件而言，有更强的安全性、更好的插件支持、更大的灵活性。&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;如果使用新的插件，需要对实例中所有用户的认证信息进行统一修改。&lt;/span&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px; text-wrap: nowrap;&quot;&gt;如果为了兼顾老版本配置，可以通过修改数据库服务端配置，将认证插件指定为mysql_native_password（未来有弃用风险）&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;[mysqld]
default_authentication_plugin&amp;nbsp;=&amp;nbsp;mysql_native_password&lt;/pre&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;4、row_format格式问题&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;span style=&quot;text-wrap: wrap;&quot;&gt;MySQL 5.7和8.0的默认行格式都是Dynamic，而5.7之前是COMPACT，Dynamic和COMPACT在对于数据出现行溢出问题时处理策略不同。&lt;/span&gt;如果有库表的行格式使用到了MySQL早期的Compact格式，在进行升级前必须对这部分表字段格式先行调整为Dynamic。&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#查看存储引擎默认的行格式
select&amp;nbsp;@@innodb_default_raw_format;&amp;nbsp;

#查看表的行格式
show&amp;nbsp;table&amp;nbsp;status&amp;nbsp;like&amp;nbsp;&amp;#39;table_name&amp;#39;&amp;nbsp;\G&amp;nbsp;

#建表时指定行格式的语法
create&amp;nbsp;table&amp;nbsp;t1(in&amp;nbsp;int,name&amp;nbsp;varchar(10))&amp;nbsp;row_format=compact;

#修改表的行格式
alter&amp;nbsp;table&amp;nbsp;t1&amp;nbsp;row_format=dynamic;&lt;/pre&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;5、数据库发行版不一致的问题&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;如果是跨发行版升级，比如从 Percona 5.7升级到 MySQL 官方发行版8.0，需要先将 Percona 5.7转换为官方版然后再进行升级操作&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;6、canal升级测试&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;如果有依赖Canal组件，需要注意Canal1.14对于mysql8的支持不够好，比如隐藏索引导致报错、新的binlog格式无法识别等问题，所以还需要对Canal进行升级&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;7、表名大小写问题&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;MySQL配置项 lower_case_table_names用于设置表文件名大小写存储规则。该值默认为0，表示在进行物理存储和查询时都区分大小写。在升级过程中需要注意之前实例的配置，如果有配置为1的（表示在进行物理存储和查询时自动将大写转换为小写），那么在进行升级的时候就必须要指定为1，因为&lt;/span&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px; text-wrap: nowrap;&quot;&gt;8.0开始该值不能进行修改，需要在实例进行初始化时就指定好，或者统一代码写法，大小写不混用&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;8、NOT NULL字段插入NULL值&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;非空字段如果有定义默认值（如DEFAULT CURRENT_TIMESTAMP） ，在传值的时候应该使用 DEFAULT 或者省略这个字段，不能继续采用NULL来获取默认值。虽然在8.0版本可以通过数据库服务端配置来强行允许这个行为，但是官方已经明确未来会废弃该功能，如果继续沿用会在未来的升级中带来更大量的排查工作所以需要&lt;/span&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px; text-wrap: nowrap;&quot;&gt;开发人员对这部分代码进行优化，后续新增代码不再使用NULL获取默认值的方式&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#字段属性
`create_time`&amp;nbsp;TIMESTAMP&amp;nbsp;NOT&amp;nbsp;NULL&amp;nbsp;DEFAULT&amp;nbsp;CURRENT_TIMESTAMP&amp;nbsp;COMMENT&amp;nbsp;&amp;#39;创建时间&amp;#39;

#插入语句
insert&amp;nbsp;into&amp;nbsp;t1(create_time)&amp;nbsp;VALUES&amp;nbsp;(NULL)&lt;/pre&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px; text-wrap: nowrap;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;9、Unsupported conversion from DATETIME to java.lang.Long&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;部分老旧系统的代码存在将 DATETIME 类型数据转换为 Long 类型的情况，由于新版本JDBC驱动中不支持这种自动转换，所以需要对这部分代码进行优化，显式地进行日期/时间到时间戳的转换&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;10、驱动兼容问题&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;数据库升级后JDBC版本也需要进行统一升级，这也是最容易遇到的问题&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;&amp;lt;dependency&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;groupId&amp;gt;com.mysql&amp;lt;/groupId&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;artifactId&amp;gt;mysql-connector-j&amp;lt;/artifactId&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;version&amp;gt;8.0.33&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/pre&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;text-wrap: nowrap; font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;11、字符集默认排序规则问题&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;text-wrap: wrap;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;;&quot;&gt;在MySQL8中，UTF8MB4使用的排序规则默认为utf8mb4_0900_ai_ci，而之前的版本中是utf8mb4_general_ci，为了兼容性可以通过配置文件指定为之前的排序规则&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;[mysqld]
character_set_server			=&amp;nbsp;utf8mb4
collation_server&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;utf8mb4_general_ci&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Tue, 02 Dec 2025 09:08:13 +0800</pubDate></item></channel></rss>