ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Ubuntu下压缩包安装MySQL 9:手动部署全流程解析

Ubuntu下压缩包安装MySQL 9:手动部署全流程解析 随便搜一下Ubuntu安装MySQL教程十有八九都是让你敲apt install mysql-server但这几年我用下来越来越觉得这条路子在某些场景下确实有点掣肘。比如企业内网环境没法连外网源、或者你需要同时部署多套不同版本实例做测试、又或者你想把数据目录放到特定磁盘、自定义一堆编译参数——这时候apt装出来的包就像一盘预制菜方便是真方便但你想调整口味就难了。所以我个人碰到这类需求一直习惯走“压缩包安装”路线也就是用官方发布的二进制tar包手动部署。这篇文章我把Ubuntu下通过压缩包安装MySQL 9的整套流程完整捋一遍重点不是我敲了什么命令而是每一步为什么要这么做踩过哪些坑希望看完你也能独立搞定而不是复制粘贴就跑。为什么今天特意写MySQL 9原因是这个系列版本划分跟以前有点不一样很多人容易搞混。以前MySQL的版本号像是8.0、5.7一眼就知道大概的迭代关系而现在官方把版本线拆成了LTS长期支持版和Innovation创新版这两条线MySQL 9就是Innovation这一类。说白了它是一个功能更新更激进、但维护支持周期相对短的版本。这并不意味着它不能用关键是你要清楚自己的使用场景——我要说的是“通过官方压缩包部署”这件事本身正好可以绕开系统仓库里的旧版本和一堆自动初始化的黑盒逻辑让你清清楚楚看到每个环节发生了什么。这套方法适合谁三类人特别适用一类是做运维工程的需要快速在不同虚拟机里复现环境第二类是开发或测试要在本机跑一个独立版本做兼容验证第三类就是单纯想深入理解MySQL安装细节的爱好者。我会从下载、解压、初始化、配置、启动到安全加固一步步讲文章里出现的所有路径、参数、命令都是我实际验证过的你可以直接参考。先提醒一句整个过程需要root权限或者一个可以sudo的普通用户。1. 安装前的整体设计为什么放弃apt压缩包方案优势在哪1.1 apt安装和压缩包安装的本质区别很多人觉得apt安装没什么不好敲一条命令装完就能用多省事。确实对于日常开发环境来说apt够用但你要知道apt安装的MySQL本质上是把仓库里打好的deb包拆开把二进制、配置文件、启动脚本散落到系统标准目录里。这个过程的优点是自动化程度高缺点也正在这里——你没法干预。举个例子apt安装后默认的数据目录是/var/lib/mysql配置文件读写顺序、sock文件位置、日志路径都被发行版维护者定死了。你想把数据目录放到/data/mysql可以但需要额外调整AppArmor策略和etc目录下的配置绕来绕去很麻烦。压缩包安装则完全相反所有东西都在你自己指定的目录里数据、配置、日志、二进制文件全在那个目录树下想要换位置就换位置想要多实例就多实例互不污染。打个比方apt安装像住酒店设施齐全但你动不了格局压缩包安装像租毛坯房水电自己接但装修方案完全自己说了算。对于生产环境、定制化部署、多版本共存这些需求后者明显更顺手。另外还必须提一点apt源里的MySQL版本往往滞后滞后程度取决于Ubuntu的版本。Ubuntu 22.04默认源里的MySQL还停留在8.0.x如果你想尝鲜MySQL 9的新特性或者需要一个指定小版本做测试apt仓库大概率满足不了。压缩包安装直接去官网下载tar归档版本精确到小版本号主动权完全掌握在自己手里。1.2 版本选择别把Innovation和LTS搞混在下载之前我建议你先理解一下MySQL 9这个版本号在官方版本体系里的位置。Oracle现在把MySQL分成两个发布模型LTSLong-Term Support长期支持版比如8.0和8.4这类版本维护周期长bug修复和安全性更新持续很多年适合生产环境。Innovation创新版比如9.0、9.1这种短期版本每两三个月出一个新版本功能迭代快但维护支持周期很短大约只有一年左右。MySQL 9系列就属于Innovation。这倒不是说它不能用很多新特性确实是Innovation版先落地比如前几年优化器相关的改进、InnoDB的新功能都是先在短期版本里试水。但如果你是用在生产环境、图省心理论上我会建议官方LTS版本这篇教程里演示用的版本虽然是9系列但整个压缩包安装的方法论和操作步骤在所有官方通用版二进制包上完全一致你换成8.4 LTS也毫无问题。选版本还有一个容易忽略的点架构对齐。下载前先确认你的服务器架构绝大多数Ubuntu服务器是x86_64架构对应x86_64开头的Linux通用包如果是ARM芯片或者云上的ARM实例要选aarch64对应的包。选错了的结果一般不是马上报架构不兼容而是一运行就出现诡异的Exec format error。1.3 准备阶段先把这些依赖和清理工作做完压缩包安装最常被新手忽略的是操作系统层面的依赖准备。MySQL二进制包虽然自带大部分运行库但有些基础库它默认是依赖系统的解密的说法是“能跑起来但缺了关键库会静默失败”。我这里列一下常见的检查项libaio1库MySQL的InnoDB引擎在Linux上依赖异步IO接口对应的就是libaio。Ubuntu上如果没安装初始化或启动时大概率报libaio.so.1: cannot open shared object file这个经典的错误。解决方式就是apt install libaio1就这么简单。libncurses相关以前老版本mysql客户端依赖这个新版本基本内置了但装一下也无妨。磁盘空间MySQL基础安装加数据文件我建议预留至少2GB空间别卡在一个分区满了导致初始化一半失败的尴尬局面。保证系统时间正确这个影响日志时间戳和后续的SSL证书生成虽然不直接装不上但出问题排查时特别迷惑。如果你之前用apt装过MySQL建议先想清楚要不要保留旧数据。如果不要就把旧服务停掉并彻底移除避免端口、sock文件、服务名发生冲突。这一步不能跳过否则后面会出现3306端口被占用或者mysql.sock已存在这种极其磨人的问题。2. 下载与解压版本包拿到手之后的目录规划2.1 从官网下载正确的压缩包下载地址建议直接去MySQL官方下载页面找“MySQL Community Server”的Generic版本。这一节看起来简单实际上有几个细节特别容易弄错。第一页面上的下载按钮有“Linux - Generic”和各个发行版专用包我们要选的就是带“Linux - Generic”字样的压缩包格式是tar.xz或者tar.gz。不要选“Linux - Ubuntu”开头的deb包那又回去了。第二注意文件名里的小版本号比如mysql-9.0.1-linux-glibc2.28-x86_64.tar.xz这一类。glibc版本一般不用太担心只要Ubuntu不是老得离谱基本都满足条件。第三下载大文件到服务器上有两种常见方式一种是在本地下载完后用scp或rsync传上去另一种是直接在服务器上用wget拉取。我习惯拉取官方页面上的noarch.rpm或者sources下面的直链地址实际上下载页面点开后浏览器地址栏会露出真正的CDN链接把那个链接复制到服务器上wget是可行的。服务器上执行类似wget https://dev.mysql.com/get/Downloads/MySQL-9.0/mysql-9.0.1-linux-glibc2.28-x86_64.tar.xz如果没有安装wget用apt install wget装上。2.2 目录规划是压缩包安装的必修课下载完的tar包解压后出来的是一个名字很长的目录比如mysql-9.0.1-linux-glibc2.28-x86_64。很多人图省事就在这个目录里直接跑实际上不建议这么做。原因有二一是目录名带版本号以后升级的时候容易路径混乱二是这个目录如果放在家目录、/tmp这一类地方风险点比较多。我习惯把整个MySQL安装树统一放到一个不带版本号的目录下通过软链接来解决版本关联的问题。具体做法是mv mysql-9.0.1-linux-glibc2.28-x86_64 /usr/local/mysql-9.0.1 ln -s /usr/local/mysql-9.0.1 /usr/local/mysql这样/usr/local/mysql就是一个稳定路径后面配置环境变量、写配置文件都指向这个路径。以后升级新版本只要把新目录解压到/usr/local下面改一下软链接指向数据目录不动回滚也容易。这个思路来自Java安装的惯例在用MySQL压缩包部署时同样好用。2.3 解压过程中的典型错误与文件整理解压命令不用太多花哨cd /usr/local tar -xJf mysql-9.0.1-linux-glibc2.28-x86_64.tar.xz这里-J选项是给xz格式用的如果你下载的是.tar.gz格式就用tar -xzf。解压完成后先别急着删除安装包我建议保留压缩包在服务器上某个固定目录比如/opt/software方便以后快速重装或换版本。解压之后检查一下目录内容正常情况下应该能看到bin、lib、share、docs等子目录还有一份README。请注意一点这个压缩包解压后默认没有data目录也没有my.cnf它把初始化和配置的步骤完全交给了使用者。不要觉得“装完怎么没有配置文件”而惊慌这正是我们接下来要手工解决的。这时候可以做一件事把MySQL的bin目录加进PATH。我个人的做法是写入/etc/profile.d/mysql.sh这个文件内容如下export PATH/usr/local/mysql/bin:$PATH然后source /etc/profile或重新登录就能直接敲mysql命令而不用每次输全路径。这个做法的好处是只对系统全局生效不污染root用户的.bashrc而且独立成文件日后删除也干净。3. 初始化数据目录MySQL真正落地的第一步3.1 创建mysql用户和权限规划解压完、路径也规划好之后千万不要直接在root用户下初始化数据目录。倒不是说你不行而是MySQL官方和一般实践都要求用一个专用系统用户运行mysqld进程。原因是安全隔离MySQL进程如果以root身份运行一旦被注入或者越权攻击者就拿到了整个系统的最高权限。用专用用户运行即使数据库被攻破权限也限制在数据库文件上。创建用户的命令useradd -r -s /bin/false mysql解释一下参数-r表示创建系统用户-s /bin/false表示这个用户不能用来登录shell都是禁用的。创建完用户后把整个MySQL安装目录的属主改给它chown -R mysql:mysql /usr/local/mysql这里有个小细节理论上安装目录只需要root可读可执行、数据目录给mysql用户就够了但我个人习惯把整个安装目录都赋给mysql用户一是不用反复调整权限二是某些插件运行时会在安装目录下写临时文件省得以后出问题。3.2 写一份简洁但够用的my.cnf配置文件在MySQL 9的压缩包安装里配置文件的位置由启动参数或默认搜索顺序决定。默认情况下mysqld启动时会依次查找/etc/my.cnf、/etc/mysql/my.cnf、还有安装目录下的my.cnf。我建议你在/etc/my.cnf创建一个文件因为这是最经典、最不会被系统其他包干扰的位置。一个基础配置示例[mysqld] basedir/usr/local/mysql datadir/usr/local/mysql/data socket/usr/local/mysql/mysql.sock pid-file/usr/local/mysql/mysql.pid port3306 character-set-serverutf8mb4 collation-serverutf8mb4_0900_ai_ci lower_case_table_names1 [client] socket/usr/local/mysql/mysql.sock我来逐行解释这里为什么这么写。basedir和datadir是安装目录和数据目录的真实绝对路径。socket文件路径很关键客户端连接本机MySQL时默认会去/tmp/mysql.sock或者是编译时默认的位置寻找但如果我们在配置里指定了socket路径并且跟客户端不一致就会出现传说中的“Cant connect through socket错误。所以好处是你在配置里明确写死客户端配置里的socket路径也要一致。配置文件末尾的[client]段里指定socket就是为了保证客户端命令行工具能找到正确位置。character-set-server和collation-server设置默认字符集为utf8mb4。现在新项目我强烈建议默认utf8mb4不然遇到emoji或者中文、emoji组合场景容易踩字符集的坑。要注意MySQL 9的默认collation是utf8mb4_0900_ai_ci这是针对Unicode 9.0标准的如果你指定utf8mb4_general_ci也能用但效率稍微不同。我直接用官方默认值。lower_case_table_names1的意思是表名存储为小写、比较时不区分大小写。这跟Windows上的行为一致开发、测试和线上环境最好保持一致。但注意这个参数必须在初始化之前确定初始化之后再改会出问题因为数据字典里的表名信息已经确定了大小写状态。3.3 初始化命令演变mysqld --initialize 与 --initialize-insecure写好了配置文件接下来就该初始化数据目录。这里有两个选择mysqld --initialize初始化后会在日志中输出一个临时root密码需要你从错误日志里找出来。mysqld --initialize-insecure初始化后root用户是空密码方便本地马上登录去修改密码。我个人的建议如果只是本机测试用--initialize-insecure最省事因为不用去翻日志。如果是想模拟生产交付流程或者让别人接手那么用--initialize更贴近生产习惯。执行初始化前先确保/usr/local/mysql/data目录不存在或者为空。如果目录已存在且有旧数据初始化命令会直接拒绝并提示目录非空。为了方便复现我们先把data目录建好并赋权mkdir -p /usr/local/mysql/data chown mysql:mysql /usr/local/mysql/data然后切换为mysql用户执行初始化。这里要注意的一点是不要用root直接跑初始化最好用su - mysql或者sudo -u mysql。完整命令sudo -u mysql /usr/local/mysql/bin/mysqld --defaults-file/etc/my.cnf --initialize-insecure如果你用的是--initialize初始化完成后记得查看错误日志一般在datadir目录下的error.log或*.err文件里里面有一行类似“A temporary password is generated for rootlocalhost”的记录。那个密码只在第一次登录时有效登录后必须立刻修改。我为什么会强调用--defaults-file显式指定配置文件因为在压包安装场景下如果某些选项跟默认值不一致不指定配置文件可能会导致命令找到的是系统里其他版本的配置。显式指定可以排除这种不确定性值得养成习惯。4. 启动、日志与自启动配置让MySQL作为服务稳定运行4.1 命令行启动与服务常见的坑数据目录初始化完成后服务就可以启动了。最简单的启动方式是直接执行mysqld但那样进程会占用当前终端而且没有日志滚动功能。所以无论是测试还是生产我都建议用mysqld_safe或者通过systemd来启动。mysqld_safe是MySQL自带的一个启动脚本壳它会帮你监控mysqld进程如果mysqld意外退出它会尝试重新拉起。这在调试阶段非常有用因为能看到完整日志。启动命令sudo -u mysql /usr/local/mysql/bin/mysqld_safe --defaults-file/etc/my.cnf 第一次启动时我建议在前台跑mysqld --console而不是后台原因很直接前台模式下所有日志都直接打到终端上一旦起不来你能立刻看到报错后台模式还需要去翻日志文件。等到确认能正常启动再切回mysqld_safe或systemd方式。实际启动过程中最常见的两个启动失败一个是我前面说的libaio.so.1缺失一个是权限问题datadir目录不是mysql用户拥有或者my.cnf里某个路径的父目录不可写。这些报错通常都能直接看日志解决建议先养成熟练追日志的习惯。4.2 用systemd管理进程实现开机自启mysqld_safe适合调试但生产环境我更推荐使用systemd来管理MySQL进程。毕竟Ubuntu的init系统已经全面拥抱systemd开机自启、崩溃拉起、日志统一journalctl管理这些都是实打实的提升。systemd的service文件通常放在/etc/systemd/system/mysql.service内容如下[Unit] DescriptionMySQL Server 9.0 Afternetwork.target [Service] Typesimple Usermysql Groupmysql ExecStart/usr/local/mysql/bin/mysqld --defaults-file/etc/my.cnf LimitNOFILE65535 Restarton-failure [Install] WantedBymulti-user.target写完文件后执行systemctl daemon-reload systemctl start mysql systemctl enable mysql此时可以用systemctl status mysql查看状态用journalctl -u mysql查看日志。这个方案比mysqld_safe更干净的一点进程直接由systemd管理不会再额外包一层守护进程日志也不会自己滚动到文件里而是统一交给journald对排查问题非常有帮助。这里有个注意点Typesimple意味着systemd认为ExecStart进程一启动就算进入运行状态如果mysqld因为配置错误很快退出systemd会在几秒内反复尝试重启有时会造成“疯狂的假象”。所以先把服务调通再写systemd文件别一开始就上systemd这是个经验之谈。4.3 环境变量和PATH的有序梳理服务起来了接下来就是命令行工具能不能敲通的问题。如果你已经加过PATH那么在任意目录下敲mysql --version应该能看到版本信息。如果没有加至少得用全路径/usr/local/mysql/bin/mysql。这里分享一个细节/usr/local/mysql目录下默认包含bin、lib、share等子目录但没有conf目录没有scripts目录很多老教程里写的mysql_install_db脚本在MySQL 9里已经不存在了取而代之的是mysqld --initialize。如果你是从旧教程照抄命令容易卡在这里。所以看到带版本号的命令要习惯先ls bin/看一眼有什么工具再决定怎么执行。还有一个易错点Ubuntu系统里可能预装了mariadb的客户端或者自带的/usr/bin/mysql这个命令和MySQL官方客户端的版本有可能冲突。当你敲mysql时如果PATH里/usr/local/mysql/bin排在/usr/bin之前那么会优先用我们装的官方客户端否则可能进的是系统自带的MariaDB客户端连接时客户端和服务端协议如果有细微差异可能报奇怪的错。查命令来源用which mysql就可以看到它指向哪里。5. 安全加固与连接验证初始化之后必做几件事5.1 设置root密码并用安全脚本扫描安装完MySQL并成功启动后第一件必须立刻做的事情就是设置root密码。如果你使用了--initialize-insecure那此时的root用户是空密码直接允许空密码登录意味着任何人都能通过本机socket连接上数据库。修改密码最简单的办法mysql -u root --socket/usr/local/mysql/mysql.sock进入交互界面之后执行ALTER USER rootlocalhost IDENTIFIED BY 你的强密码; FLUSH PRIVILEGES;如果你当初用的是--initialize生成临时密码就需要先用临时密码登录再执行上面的ALTER USER。设置完密码后可以运行mysql_secure_installation或者像下面这样手动检查SELECT user, host, plugin FROM mysql.user;这个查询主要检查有没有异常的默认账号比如空用户、host为%的root等。正常情况下应该只有rootlocalhost及系统默认的几个匿名用户如果有不认识的建议清理掉。我这里特别想强调一点rootlocalhost只允许本机socket连接不要把root的host改成%也就是允许远程连接。如果确实需要远程管理建议新建一个专用的管理账号例如CREATE USER admin192.168.1.% IDENTIFIED BY 另一个强密码; GRANT ALL PRIVILEGES ON *.* TO admin192.168.1.% WITH GRANT OPTION; FLUSH PRIVILEGES;这样做的好处是即使远程账号泄露本地root账户仍然安全审计也清楚知道是谁连进来的。5.2 验证本地连接与远程访问的完整链路安全配置完成之后需要验证整个链路是通畅的。第一步用socket连接测试mysql -u root -p --socket/usr/local/mysql/mysql.sock输入密码能进客户端说明服务正常、socket路径正确。第二步测试TCP连接mysql -u root -p -h 127.0.0.1 -P 3306这里要注意的是-h 127.0.0.1强制走TCP协议而不是socket。如果这一步报错或者提示host不允许连接多半是MySQL用户的host限制问题。刚才我们建的root用户host是localhost所以通过127.0.0.1连接时其实走的是TCP如果报Access denied需要查看mysql.user表里的host配置准确说通过TCP从127.0.0.1连接时匹配的是rootlocalhost还是root127.0.0.1这是个经典的迷惑点。如果你要允许局域网内其他机器远程连接还要确认防火墙端口开放Ubuntu上常见的是ufwufw allow 3306/tcp不过我个人建议先只监听内网或指定IP不要让3306暴露在公网。生产环境更推荐通过SSH隧道或者内网访问而不是直接开公网端口。这一步不是MySQL自己的配置但很多人因为忘了防火墙而“MySQL启动正常但连不上”排查半天所以一定要纳入检查范围。5.3 关机盘整清理默认测试库和临时文件MySQL初始化之后自带的默认数据库有sys、performance_schema、mysql以及一个test库。test库历史上一直存在在没有显式用户权限的情况下任何人都能访问这个属于安全隐患。我建议把它删掉DROP DATABASE IF EXISTS test;另外performance_schema和sys不要动它们分别承载性能监控和辅助视图的功能删了会影响运维诊断。mysql库是权限核心库更不能乱动。同时检查一下datadir目录里面有没有奇怪的临时文件比如ib_tmp开头的文件或者.sock残留。MySQL正常停止的情况下会清理这些临时文件但被强杀的情况下可能残留影响下次启动。判断是否干净启动的标准就是日志里没有报错状态稳定。6. 十分钟排障手册压缩包安装MySQL最常遇到的坑6.1 经典报错逐一对症这部分我整理了一个速查表基本覆盖压缩包安装方式下90%的报错场景报错信息原因解决方案libaio.so.1: cannot open shared object file缺少libaio依赖apt install libaio1Cant connect to local MySQL server through socketsocket路径不一致或者服务没起来统一my.cnf里[mysqld]和[client]的socket路径确认服务状态The data directory is not empty初始化目录里已有残留文件清空datadir目录或换新目录重新初始化Unit mysql.service not foundsystemd服务文件路径不对或没写确认/etc/systemd/system/mysql.service存在并执行systemctl daemon-reloadAccess denied for user rootlocalhost密码错误或host不匹配用--skip-grant-tables方式临时登录修改user表但要特别小心[ERROR] Cant start server: Bind on TCP/IP port: Address already in use3306端口被占用ss -lntp这里要重点展开一下Access denied场景。某次我在一台服务器上开发明明密码是对的但用mysql -u root -p始终被拒。后来发现是配置文件里[client]段的socket路径指向的不是服务端正在监听的socket。客户端连的是A socket服务端听的是B socket所以每次都是“找不到socket”而不是明文提示。这种时候日志里往往没有任何错误非常迷惑。解决方式就是把[client]和[mysqld]的socket路径配置成一致或者干脆用mysql -u root -p -h 127.0.0.1 -P 3306走TCP绕开socket。6.2 数据初始化失败时如何恢复和清理初始化失败虽然不常见但一旦发生很多新手会直接重新跑mysqld --initialize然后发现又报“目录非空”。原因是失败的初始化已经在datadir里写入了部分文件包括#innodb_redo这类重做日志子目录。遇到这种情况我把恢复步骤总结成一句口诀先备份再清空然后回到干净状态。具体操作如下# 备份现有数据目录 mv /usr/local/mysql/data /usr/local/mysql/data.bak.$(date %s) # 创建干净目录 mkdir -p /usr/local/mysql/data chown mysql:mysql /usr/local/mysql/data # 重新执行初始化 sudo -u mysql /usr/local/mysql/bin/mysqld --defaults-file/etc/my.cnf --initialize-insecure那些data.bak.*目录不要急着删万一后面需要恢复旧库就从里面拿数据文件。恢复数据本质上就是把backup下的文件再拷回datadir但版本必须完全一致跨小版本恢复有一定风险。这里要补充一个个人教训初始化前一定要先看错误日志而不是一头扎进去重跑。有一次我连续重试了很多次后来才发现是my.cnf里多了一个不存在的innodb_flush_methodO_DIRECT导致InnoDB直接拒绝启动。系统不会替你纠错配置语法它只会把原因写进日志你越早看日志越少走弯路。6.3 自启失败的排查systemd、权限和配置遗忘用systemd管理MySQL后最常见的故障就是systemctl enable mysql设置自启后重启服务器发现服务没起来。排查顺序一般是systemctl status mysql看是否处于failed状态journalctl -u mysql -n 50看日志末尾的报错手动执行sudo -u mysql /usr/local/mysql/bin/mysqld --defaults-file/etc/my.cnf看看能不能前台起来。第三个步骤非常关键。如果前台能起来说明配置和数据没问题问题出在systemd执行环境或者权限如果前台都起不来那八成是os依赖或配置错误跟systemd无关。另外提一个系统层面的坑很多服务器上会有AppArmor策略Ubuntu自带的AppArmor对/usr/sbin/mysqld、/var/lib/mysql这类路径有默认规则。我们手工安装在/usr/local/mysql下AppArmor可能拦截mysqld访问数据目录导致启动时崩溃。现象就是日志里权限被拒绝但chmod和chown都设置完美。解决办法是检查/etc/apparmor.d/下是否有mysql相关的profile如果有需要添加一条路径规则或者直接禁用该profile只在测试环境这么干。在Ubuntu 22.04和24.04里这类限制一般不会触发但在一些强化过的私有系统上容易遇到我遇到过不止一次所以写出来提醒你。7. 变通方案与经验沉淀压缩包安装还可以这样玩7.1 多实例部署的核心思路压缩包安装另一个大优势是天然支持多实例。同一台机器上同时运行两个MySQL实例比如一个测试版一个稳定版这在apt方式下操作起来非常拧巴但在压缩包方式下就十分顺畅。核心思路其实不复杂每个实例用独立的datadir、独立的socket、独立的端口一套二进制文件可以给多个实例复用。配置文件里只要区分开datadir、socket、port、pid-file以及日志文件名就可以实现多实例共存。比如[mysqld1] datadir/data/mysql1 socket/tmp/mysql1.sock port3307 pid-file/tmp/mysql1.pid [mysqld2] datadir/data/mysql2 socket/tmp/mysql2.sock port3308 pid-file/tmp/mysql2.pid启动的时候指定不同的配置文件或者用同一个配置文件的不同section实际生产中用得更多的还是每个实例一个配置文件、一个systemd unit。流程熟练之后这个扩展很自然。7.2 升级与回滚软链接的用武之地文章开头提到的软链接方案在升级场景中尤其有价值。比如当前用的是/usr/local/mysql-9.0.1新版本9.0.2发布后想升级操作步骤大概是停掉服务备份旧版本目录其实如果有软链接备份不用拷贝整棵目录树只需要确认数据目录解压新版本到/usr/local/mysql-9.0.2把/usr/local/mysql软链接切到新版本目录启动服务验证版本“SELECT VERSION();”。数据目录千万不能乱动也不要让新旧版本同时访问同一份数据文件。升级后如果一切正常旧版本目录可以留着做回滚出了兼容性问题停掉服务把软链接指回旧目录重新启动一套回滚动作几十秒就搞定。这种操作密度在apt方式下要复杂很多。7.3 个人实操中的几点心得最后说一点我自己的经验不是正儿八经的教程内容但确实帮我在很多次部署里少踩坑第一压缩包安装看似比apt多了一堆手工步骤但第一次完整走完后你对自己系统上MySQL的每个文件在哪个位置、每个配置在哪个文件里会有一种极其清晰的认识。这种掌控感在排障的时候是无价的。第二办事要有点洁癖。路径规划、配置分离、日志定时清理这些事一开始就做好远比事后补救容易。比如我习惯把配置文件放在/etc/my.cnf数据放在一个独立挂载点下日志单独目录日积月累服务器的可维护性会高很多。第三命令执行前多看一眼选项。像--initialize和--initialize-insecure只差一个单词结果差之千里一个是生成临时密码一个是空密码。如果是线上操作临时密码弄丢会直接影响服务上线所以犹豫的时候先回车敲个mysqld --help --verbose | grep initialize看看帮助总不会错。如果你也正在用Ubuntu准备部署MySQL 9或者类似的版本希望这篇来自实战的笔记能帮你一把。按照上面的顺序走顺利的话半小时内就能看到一个干净、可控、版本清晰的MySQL实例在跑。真遇到不顺的地方冷静下来看日志绝大部分问题都会在日志里把答案告诉你。
返回列表