
1. 为什么非要折腾 .tar.gz 方式安装 MySQL先聊点实际的。很多人一听到 Linux 下装 MySQL第一反应就是apt install mysql-server或者yum install mysql-community-server一条命令搞定顶多配个密码就完事。那为什么还有那么多人翻出 .tar.gz 压缩包老老实实手动装一遍我在实际工作里遇到过几种情况逼着你必须走这条“笨路”。第一种是服务器环境特殊。有些内网环境、国产化系统或者最小化安装的 Linux 发行版软件源里根本没有 MySQL或者源里的版本老得掉渣还是 5.6 时代的东西。CentOS 默认源里连 mysql-server 都没有只有 MariaDB但项目又必须用官方 MySQL这时候只能去官网手动下载 tar.gz 包。第二种是版本洁癖或者说版本强需求。新项目要用 MySQL 8.0 的窗口函数、CTE 这些特性但生产环境是离线内网预装的数据库版本不够yum 源又连不上。第三种更常见——你是开发环境想装一个“干净”的 MySQL不受系统包管理器的一堆依赖影响想装几个版本就装几个版本想删就删直接删目录完事。用 .tar.gz 方式安装最大的好处就是可控性极强。所有文件都集中在一个目录下数据目录、配置文件、日志文件、启动脚本全部由你说了算。不像 rpm/deb 包那样把东西散落在系统的各个目录里卸载的时候还得清理半天残留。我自己的习惯是装到/usr/local/mysql数据目录单独放这样后面要做数据迁移、做备份甚至整机复制都非常方便。这篇文章面向的读者我默认你已经有基本的 Linux 操作经验会敲命令行、会用 vim 或者 nano 编辑文件。如果你是个刚接触 Linux 的小白也不用慌下面每一步我都会写得非常细你照着敲就行。2. 安装前的准备工作下载、环境检查、依赖处理2.1 从官网找到对的 MySQL 版本这一步看着简单但很多人在官网迷路。MySQL 官方下载页面dev.mysql.com/downloads/mysql/进去之后首先会让你选择操作系统千万别选错。我们要的是Linux - Generic也就是通用二进制版本下面会有 .tar.gz 格式的压缩包下载链接。选版本的时候我建议优先选8.0.x 的 GA 稳定版不要一看到 8.4 或者 9.x 就手痒。MySQL 的版本策略有点特殊8.0 目前是广泛应用的生产版本各种兼容性问题踩得差不多了社区资料也最全。另外注意区分两个包带-glibc2.12或类似标识的是预编译好的二进制包适用大多数 Linux 发行版我们下载这个。不带这个标识的源码包Source Code那是要自己编译的新手先别碰。下载的时候还有一个讲究。直接在浏览器里下载再上传服务器速度慢不说还容易断。我一般用wget直接在服务器上下载cd /usr/local/src wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.36-linux-glibc2.12-x86_64.tar.gz如果你下载的时候被提示需要登录可以换一个思路直接用 CDN 链接。官网页面里每个版本的小字部分通常隐藏着No thanks, just start my download这种快速链接右键复制链接地址放到wget后面就行。下载完之后先确认一下文件大小MySQL 8.0 的二进制包体积大约在 200~300MB 左右如果只有几十 KB那大概率下错东西了。2.2 检查系统环境和基础依赖在动手之前先把系统环境摸清楚。我列几个必须要检查的项目查看系统架构和版本uname -m # 输出 x86_64 说明是 64 位系统 cat /etc/os-release # 查看发行版信息MySQL 8.0 官方提供的 Linux 通用包只支持 64 位系统32 位系统直接放弃这条路。检查是否已经安装过 MySQL 或依赖冲突这一点特别重要。很多人在初始化数据库的时候报错就是因为系统里已经有旧的 MySQL/MariaDB 残留把/etc/my.cnf或者数据目录占用了。rpm -qa | grep -i mysql # 如果有输出说明有旧包 rpm -qa | grep -i mariadb # 如果有输出需要先移除如果有 MariaDB执行yum remove mariadb-libs之类的命令先清掉。不要犹豫两个数据库的库文件如果混在一起后面会出各种莫名其妙的问题。检查基础编译运行库MySQL 二进制包虽然不需要你现场编译但是运行它需要系统有libaio这个依赖库。我踩过最典型的坑就是所有步骤都做完了结果启动服务的时候报错error while loading shared libraries: libaio.so.1。不同发行版的安装命令不一样Debian/Ubuntu 用apt update apt install -y libaio1 libnuma-devCentOS/RHEL 系用yum install -y libaio libaio-devel numactl有些精简版系统可能还需要安装ncurses-compat-libs可以用ldd命令检查 MySQL 的二进制文件依赖情况ldd /usr/local/src/mysql-8.0.36-linux-glibc2.12-x86_64.tar.gz # 这只是看压缩包没意义正确的做法是先解压再对解压出来的mysqld文件做检查cd /usr/local/src tar -xzf mysql-8.0.36-linux-glibc2.12-x86_64.tar.gz ldd /usr/local/src/mysql-8.0.36-linux-glibc2.12-x86_64/bin/mysqld看到输出里如果有not found字样那就对照着缺什么装什么。这一步做好后面能少掉 50% 的报错。2.3 创建专用用户和数据目录这是个被讲了无数次但总是被忽略的步骤。我见过有人直接用 root 用户跑 MySQL短时间看着没问题但隐患极大。MySQL 官方文档明确要求mysqld 进程不允许用 root 身份启动否则会直接报错拒绝运行。而且安全角度来说数据库进程权限越小越好万一被注入攻击者也拿不到系统 root 权限。创建方式# 创建 mysql 用户组 groupadd mysql # 创建 mysql 用户不创建家目录不允许登录 shell useradd -r -g mysql -s /bin/false mysql-s /bin/false这个参数会让该用户无法登录系统这是安全基线要求别为了省事不加。数据目录我习惯单独建在/data/mysql而不是默认的/usr/local/mysql/data。这样做的原因很实际数据目录和应用程序目录分离如果系统盘出了问题要重装系统只要数据盘没坏数据就不会丢。另外很多服务器的数据盘是额外挂载的比如挂载在/data下后续做扩容也更灵活。mkdir -p /data/mysql chown -R mysql:mysql /data/mysql chmod 750 /data/mysql注意这里的权限设置。750意味着只有 mysql 用户和 mysql 组有读和执行权限其他用户一律不可访问。数据库文件是敏感资产权限过松是大忌。3. 解压安装与目录规划把所有东西放在该放的地方3.1 解压 .tar.gz 并移动到目标目录准备工作完毕正式进入安装流程。cd /usr/local/src tar -xzf mysql-8.0.36-linux-glibc2.12-x86_64.tar.gz ls -ld mysql-8.0.36-linux-glibc2.12-x86_64解压出来的是一个带版本号的目录这个名字太长不好用后续配环境变量、写脚本都不方便。我习惯把它重命名成mysqlmv mysql-8.0.36-linux-glibc2.12-x86_64 /usr/local/mysql然后设置目录归属chown -R mysql:mysql /usr/local/mysql这里有个细节想多说两句。我看到有些教程在解压之后就让人把 MySQL 文件夹的权限改成777理由是“避免权限报错”。这完全是在给自己埋雷。777意味着所有用户都能读写执行任何普通用户都能直接改你的数据库文件这是灾难级的配置。正确做法就是保持mysql:mysql的所有者把权限控制在755或更紧。如果你解压之后打算用软链接的方式做多版本管理那么把目录命名为mysql-8.0.36保留版本号再建一个软链接ln -s mysql-8.0.36 /usr/local/mysql也是常见的玩法。但我个人更推荐直接改名为mysql少了软链接这一层排查问题的时候路径更清晰。3.2 配置环境变量为了让mysql、mysqldump这些命令在任何目录下都能直接用需要把 MySQL 的 bin 目录加入 PATH 环境变量。编辑用户的~/.bashrc文件vim ~/.bashrc在文件末尾添加export PATH$PATH:/usr/local/mysql/bin:/usr/local/mysql/sbin然后让配置立即生效source ~/.bashrc验证一下mysql --version如果输出mysql Ver 8.0.36 for Linux on x86_64之类的内容说明命令已经可用了。如果你是系统管理员希望所有用户都能使用 MySQL 命令可以把上面的export写到/etc/profile里面效果一样。但我自己更推荐写在用户级配置里因为服务器上不是每个人都需要访问数据库减少暴露面总是好的。3.3 提前理清 MySQL 的重要目录结构安装完 MySQL很多人看/usr/local/mysql目录一脸懵不知道每个文件夹是干嘛的。这里我把关键目录的作用和是否需要备份列个表目录/文件作用是否需要备份/usr/local/mysql/bin存放 mysql、mysqldump、mysqladmin 等可执行命令不需要安装包自带/usr/local/mysql/lib存放运行所需的库文件不需要/usr/local/mysql/share存放错误信息、字符集等支持文件不需要/data/mysql存放实际数据库数据文件如果我们配置到这儿需要核心资产/usr/local/mysql/my.cnf自建的主配置文件需要建议纳入版本管理/var/log/mysql或/data/mysql/mysql.log错误日志和查询日志视需求决定理清这个结构之后你切换版本或者迁移服务器的时候就会从容很多。数据在/data/mysql配置在/etc/my.cnf程序在/usr/local/mysql三个互不干扰。4. 编写配置文件 my.cnf这一步决定 MySQL 能不能跑顺4.1 最小可用配置是怎么来的MySQL 8.0 的安装目录里其实自带了一份默认配置路径在/usr/local/mysql/support-files/my-default.cnf。但是说实话那份配置非常保守几乎等于没配。而且 8.0 之后MySQL 对配置文件的依赖比旧版本小了很多很多参数都有默认值。你甚至可以不建配置文件直接初始化MySQL 会按照内置默认值运行。但在生产环境或者要通过调试的场景我建议还是手动写一份。官方读取配置文件的顺序是/etc/my.cnf/etc/mysql/my.cnf/usr/local/mysql/my.cnf~/.my.cnf先读到的配置生效后面的配置会覆盖前面相同的配置项。我一般会把主配置放在/etc/my.cnf这样系统上所有用户都遵循同一套配置也符合 Linux 的目录规范。下面是我整理的一份适用于大多数场景的 MySQL 8.0 最小可用配置你可以直接复制然后根据实际情况调整[client] port 3306 socket /data/mysql/mysql.sock [mysql] auto-rehash prompt\\u\\h [\\d] [mysqld] user mysql port 3306 basedir /usr/local/mysql datadir /data/mysql socket /data/mysql/mysql.sock pid-file /data/mysql/mysqld.pid log-error /data/mysql/mysql.err character-set-server utf8mb4 collation-server utf8mb4_0900_ai_ci default-storage-engine InnoDB max_connections 500 back_log 128 wait_timeout 600 interactive_timeout 600 connect_timeout 10 lower_case_table_names 1 sql_mode STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION我逐项说明一下为什么不写的参数你可以先不管。basedir和datadir是最核心的两个路径分别指程序目录和数据目录。写错任何一个MySQL 都起不来。socket文件路径也很关键本地通过mysql命令连接的时候走的是 socket 通信不是 TCP所以这个路径必须和[client]里的保持一致。character-set-server统一设置为utf8mb4这是为了支持 Emoji 表情和大部分特殊字符。MySQL 8.0 默认的 collation 是utf8mb4_0900_ai_ci这个排序规则的性能和准确性都优于旧版不建议改成老的general_ci。lower_case_table_names 1表示表名不区分大小写这一点在 Windows 开发、Linux 部署的项目里特别重要否则本地建的表叫UserInfoLinux 上报错找不到表能把人折腾疯。sql_mode里我只保留了一部分严格模式参数。STRICT_TRANS_TABLES开启后插入非法数据会直接报错而不是产生警告这能在开发阶段就暴露问题而不是把脏数据写进库里隐藏起来。4.2 初始化数据目录的正确姿势配置写好之后先别急着启动因为数据目录还是空的MySQL 没法运行。在 8.0 版本中初始化命令整合到了mysqld里面用--initialize参数。这里有一个非常关键的选择——是否使用--initialize-insecure。两者区别在于--initialize初始化时会生成一个随机 root 密码写进错误日志里你需要在日志里找出来。--initialize-insecure初始化后 root 用户是空密码可以直接无密码登录然后再自行修改。我推荐第一次使用--initialize-insecure。原因很简单你手动去找日志里的随机密码输错大小写、输错特殊符号的概率太大了搞半天连不上容易怀疑人生。先用空密码登录进去再用 SQL 语句把密码改掉整个过程清晰可控。执行初始化/usr/local/mysql/bin/mysqld --defaults-file/etc/my.cnf --initialize-insecure --usermysql注意指定--usermysql确保初始化生成的文件的属主是 mysql 用户。初始化完成后查看数据目录ls -l /data/mysql/你应该能看到mysql、performance_schema、sys、undo_001、undo_002等目录和文件。如果这些文件存在说明初始化成功。如果这一步报了错不要急着重复执行先去看错误日志也就是我们在配置里指定的log-error /data/mysql/mysql.err。4.3 配置日志系统和默认目录的权限问题日志这块值得单独说一次。MySQL 8.0 的默认错误日志位置挺隐蔽的有人找不到日志就以为程序卡死了。我们在配置文件里把log-error指向了/data/mysql/mysql.err那么注意观察这个文件是否会自动生成。如果初始化命令提示无法写入日志文件大概率是目录权限问题chown -R mysql:mysql /data/mysql还需要注意日志文件会不断增长不给它做轮转的话时间长了会占满磁盘。主流的解决方案是配置logrotate系统自带的日志轮转工具就能搞定。创建一个配置文件vim /etc/logrotate.d/mysql内容如下/data/mysql/mysql.err { daily rotate 7 missingok notifempty compress sharedscripts postrotate /bin/systemctl reload mysqld /dev/null 21 || true endscript }意思是每天轮转一次保留 7 份历史旧日志压缩。配置完后可以用logrotate -d /etc/logrotate.d/mysql做一次模拟执行检查配置有没有语法错误。5. 启动 MySQL 与 systemd 管理让它像正规服务一样工作5.1 手动启停与后台运行配置和初始化都到位后第一件事是手动启动一次确认整个链路没问题/usr/local/mysql/bin/mysqld --defaults-file/etc/my.cnf --usermysql 表示后台运行。启动后看进程是否存活ps -ef | grep mysqld或者直接尝试用客户端连接/usr/local/mysql/bin/mysql -uroot -S /data/mysql/mysql.sock如果返回了 MySQL 的欢迎界面说明安装基本成功。但这只是临时启动进程在系统重启之后会消失。要把 MySQL 变成开机自启的服务需要写 systemd 服务文件。5.2 编写并启用 mysqld.service8.0 的安装包里自带了一份 systemd 服务文件在/usr/local/mysql/support-files/mysql.server这是旧版的 SysV 风格脚本。我强烈建议不要直接用这个而是按照 systemd 的方式自己写一个管理起来更顺手。创建服务文件vim /etc/systemd/system/mysqld.service内容如下[Unit] DescriptionMySQL Server 8.0 Documentationhttps://dev.mysql.com/doc/refman/8.0/en/ Afternetwork.target Aftersyslog.target [Install] WantedBymulti-user.target [Service] Usermysql Groupmysql Typeforking PIDFile/data/mysql/mysqld.pid ExecStart/usr/local/mysql/bin/mysqld --defaults-file/etc/my.cnf --daemonize --pid-file/data/mysql/mysqld.pid ExecReload/bin/kill -s HUP $MAINPID ExecStop/bin/kill -s TERM $MAINPID Restarton-failure RestartSec10 PrivateTmpfalse几个关键点解释一下。Typeforking表示 mysqld 启动后会 fork 出一个守护进程systemd 靠 PID 文件来追踪主进程。所以pid-file路径必须和 my.cnf 里一致。ExecStart中必须加--daemonize否则 systemd 会因为进程没退出而认为启动挂起。Restarton-failure是个保险进程异常退出时能自动重启避免数据库服务因为一次崩溃就长时间不可用。配置好后重新加载并启动systemctl daemon-reload systemctl start mysqld systemctl enable mysqldenable是为了设置开机自启。最后检查状态systemctl status mysqld看到active (running)就是正常了。5.3 用一个快速脚本验证服务健康在正式投入使用之前我还习惯用脚本快速验证一下服务是否真的能正常服务客户端连接。写一个最简单的脚本#!/bin/bash # MySQL 健康检查脚本 MYSQL_USERroot MYSQL_PASSWORDyourpassword MYSQL_SOCKET/data/mysql/mysql.sock MYSQL/usr/local/mysql/bin/mysql if $MYSQL -u$MYSQL_USER -p$MYSQL_PASSWORD -S $MYSQL_SOCKET -e SELECT 1 /dev/null 21; then echo MySQL is healthy else echo MySQL is DOWN exit 1 fi把它放进 crontab 里每分钟执行一次数据库出问题的时候能在第一时间收到告警。当然你也可以用更完善的监控系统但小项目、个人服务器用这个脚本足够了。6. 安全配置与客户端连接新装的数据库必须做这几步6.1 登录并修改 root 密码如果你用--initialize-insecure初始化的那么现在 root 密码为空做安全配置的第一步就是设置密码。先用 socket 方式登录mysql -uroot -S /data/mysql/mysql.sock然后执行ALTER USER rootlocalhost IDENTIFIED BY 你的强密码; FLUSH PRIVILEGES;密码建议至少 12 位包含大小写字母、数字和特殊字符。不要用 root 这个用户名之外还要设置一个同名的远程账号后面会说为什么。6.2 创建专用账号而不是裸奔 root我见过太多人图省事直接用 root 连应用。这是非常危险的习惯。应用的数据库账号应该遵循最小权限原则只给它需要的库和表的权限。常规做法是为业务单独建用户CREATE USER app_userlocalhost IDENTIFIED BY app_password; CREATE USER app_user192.168.1.% IDENTIFIED BY app_password; GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO app_userlocalhost; GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO app_user192.168.1.%; FLUSH PRIVILEGES;这里192.168.1.%表示只允许来自这个网段的主机连接比%全放开的限制强得多。如果应用在另一台服务器上把网段改成实际的内网网段。对外网开放 MySQL 端口是火坑除非有严格的安全组规则把关否则不建议做。6.3 远程连接时的常见坑root 不允许远程、端口没开很多人在本地用 Navicat 连服务器上的 MySQL连不上就认为是 MySQL 的问题。实际上一半的“连不上”不是 MySQL 的锅。排查顺序应该是检查 MySQL 是否允许远程连接。MySQL 8.0 默认 root 只允许localhost连接需要确认你的账号 host 是不是%或者你的 IP 网段。检查防火墙是否开放了 3306 端口firewall-cmd --list-ports # CentOS 7 iptables -L -n | grep 3306 # 传统方式如果没有放行执行firewall-cmd --zonepublic --add-port3306/tcp --permanent firewall-cmd --reload检查程序监听地址。MySQL 8.0 默认绑定*也就是所有网卡一般没问题。但如果你的 my.cnf 里设置了bind-address 127.0.0.1那对不起外部怎么都连不上。需要多网卡时也可以绑定具体 IP。本地客户端连接时确认 socket 文件和 TCP 连接别混用。Navicat 或 DBeaver 这类图形工具走的是 TCP不要填 socket 路径。7. 常见问题与排查技巧实录这一节是我最想分享的因为每种报错基本都对应着之前某个配置环节没做对。我按报错信息给你列一个速查表。报错信息原因解决办法./mysqld: error while loading shared libraries: libaio.so.1缺少 libaio 依赖库安装 libaio/libaio1 后重试Cant open the mysql.plugin table数据目录损坏或初始化不完整删除 datadir 下内容重新初始化The server quit without updating PID filePID 文件无法写入或 datadir 权限错误检查/data/mysql的属主和权限Access denied for user rootlocalhostroot 密码错误用--skip-grant-tables跳过授权表重置密码Cant connect to local MySQL server through socket /tmp/mysql.sockclient 和 server 的 socket 路径不一致检查 my.cnf 中 [client] 和 [mysqld] 的 socket 配置Table xxx doesnt exist但表明明存在表名大小写敏感问题在 my.cnf 中设置lower_case_table_names 1启动时提示[ERROR] [MY-010237] Cant start server: Bind on TCP/IP port端口被占用lsof -i:3306或ss -lntp | grep 3306找到占用进程7.1 密码忘了怎么重置这是所有 DBA 实操中一定会遇到的场景。某天你发现 root 密码记不清了应用连不上库又不能贸然重启服务这时可以用跳过授权表的方式登录。# 停止服务 systemctl stop mysqld # 以跳过授权表的方式启动 /usr/local/mysql/bin/mysqld --defaults-file/etc/my.cnf --skip-grant-tables --skip-networking 跳过授权表后不需要密码就能登录mysql -uroot -S /data/mysql/mysql.sock注意登录后要刷新授权表让内存中的 grant 表生效FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY 新密码;然后退出把刚才手动起在后台的 mysqld 进程杀干净再通过 systemd 正常启动。pkill mysqld systemctl start mysqld--skip-networking一定要加这意味着 MySQL 进程只允许本机 socket 连接不允许任何 TCP 连接防止在恢复期间被外部访问这是一个隐藏的安全开关。7.2 端口被占用的排查思路有时候启动失败看日志发现是 bind 端口失败这时候不要只盯着 MySQL 本身。先用ss -lntp | grep 3306看看 3306 端口上到底是谁。经常会出现一个情况旧版本的 mysqld 进程没杀干净或者之前手动启动过多个实例两个进程同时争抢一个端口。这些残留进程用ps -ef | grep mysqld一查就能发现kill -9干掉之后重新启动。还有一种情况是其他服务恰好用了 3306 这个端口比如有些业务自己写的小程序默认也在 3306。这时候要么改 MySQL 端口要么改那个程序的端口。优先改程序端口因为改 MySQL 端口意味着所有应用的连接串都要改牵连太大。7.3 数据目录初始化失败后怎么安全重来初始化失败最大的敌人是“残留”。如果你第一次初始化失败直接第二次去执行往往还是失败因为上一次初始化生成的半成品文件污染了目录。我重来的步骤是systemctl stop mysqld 2/dev/null rm -rf /data/mysql/* chown -R mysql:mysql /data/mysql/清空数据目录之后重新初始化/usr/local/mysql/bin/mysqld --defaults-file/etc/my.cnf --initialize-insecure --usermysql这一步配合查看错误日志的方式基本能定位所有初始化问题。7.4 磁盘空间不足导致启动失败的隐蔽问题有一类问题大家很容易忽视——磁盘空间不足。MySQL 启动时要写 pid 文件、写日志、初始化 buffer pool如果磁盘满了会报一些匪夷所思的错误比如Segmentation fault或者Cant create/write to file。用df -h看一下分区使用率另外用du -sh /data/mysql/*查看哪个目录在快速膨胀。日志文件是最大的嫌疑所以前面特意讲了 logrotate 配置。另一个容易被忽视的膨胀源是 binlog二进制日志如果不控制 expire_logs_days 或 binlog_expire_logs_seconds时间一长磁盘会被拖垮。mysql 8.0 可以通过 SQL 直接设置SET GLOBAL binlog_expire_logs_seconds 604800; -- 7天并把配置写进 my.cnf 里防止重启后失效。8. 安装完成之后我还建议你做的几件事到这里MySQL 已经能正常跑起来了。但安装一个数据库只是第一步把它“收拾利索”才算完成。我建议你在安装完成后把这几件事也做了备份/etc/my.cnf和初始化配置的 SQL 脚本放到 git 仓库或者至少打包存一份。新装服务器的时候可以直接复用省得从头配一遍。设置好 binlog 的过期时间和备份策略。哪怕是最简单的mysqldump脚本也要让数据有个保底。我见过太多开发机没有备份某天数据误删了连哭都找不到地方。修改 MySQL 的欢迎语或版本提示信息减少被外部扫描工具识别的风险。在/data/mysql下留一个readme.txt记录这个实例是什么时候装的、配置了什么、改过哪些密码密码写在单独的文件里并做好权限控制方便下次接手的人快速了解情况。最后说一个我自己的使用习惯。每次装完 MySQL 之后我都会额外设置一个自定义配置文件片段放在/etc/mysql/mysql.conf.d/下面专门存放一些临时调优的参数。比如连接数不够了、缓存大小需要调整直接在这个新文件里修改不影响主配置文件。这样主配置始终保持着最小化排查问题的时候不用在几百行配置里翻找。安装数据库不是一个高频操作但每一次都值得认真对待。把流程吃透把每一步为什么要那么做搞清楚比单纯记住命令要可靠得多。