ARTICLE DETAIL

资讯详情

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

Ubuntu系统MySQL安装与彻底卸载完整指南

Ubuntu系统MySQL安装与彻底卸载完整指南 1. 从一次“不干净”的卸载说起为什么需要彻底清理MySQL如果你在Ubuntu上折腾过MySQL大概率遇到过这个场景安装新版本时发现配置文件里还残留着旧版本的参数或者卸载后重装服务死活启动不起来日志里报一些“数据目录已存在”或“端口已被占用”的诡异错误。这通常不是MySQL本身的问题而是上一次卸载时“手下留情”了。在Linux系统尤其是像Ubuntu这样的发行版上用apt安装一个软件包系统会把它分散到好几个地方可执行文件放在/usr/bin/配置文件在/etc/数据文件在/var/lib/日志在/var/log/还有各种库文件、头文件、服务定义等等。当你执行sudo apt remove mysql-server时默认行为是只删除软件包本身但保留所有的配置文件和用户数据。这个设计的初衷是好的防止你误删重要数据。但当你需要“推倒重来”或者解决因配置残留导致的冲突时这个“贴心”的设计就成了绊脚石。所以一个完整的MySQL管理流程必须包含“干净的安装”和“彻底的卸载”这两个相辅相成的环节。这篇文章我就结合自己多次在Ubuntu服务器上部署和维护MySQL的经验把这两个过程掰开揉碎了讲清楚。我们不仅会走通标准流程更会深入到那些容易忽略的角落确保你装得上、卸得净系统环境始终清爽。2. 安装MySQL选择版本、仓库与实战步骤在Ubuntu上安装MySQL早已不是一条apt install mysql-server命令那么简单。你需要先做几个关键决策这直接关系到后续的稳定性和可维护性。2.1 版本与仓库选择官方仓库 vs. MySQL官方仓库Ubuntu自己的软件仓库APT仓库里包含MySQL但这里的版本往往是某个大版本系列中较旧的稳定版。例如Ubuntu 22.04 LTS自带的仓库里默认提供的是MySQL 8.0.x系列的一个版本。它的优点是开箱即用与系统集成度最高安全性更新会通过系统标准更新通道推送。但如果你需要最新的8.0小版本比如为了某个特定的Bug修复或性能优化或者想安装MySQL 8.1及以后的创新版本甚至历史版本如5.7你就需要用到MySQL官方提供的APT仓库。为什么推荐使用MySQL官方仓库版本新且全你可以轻松安装到最新的GA通用可用性版本甚至是开发里程碑版本。更新及时安全补丁和Bug修复的推送比系统仓库更迅速。管理统一官方仓库提供了完整的软件包套件server, client, workbench, router等管理起来更一致。所以除非有严格的内部规定必须使用系统自带软件包否则我强烈建议添加MySQL官方仓库进行安装。下面的步骤也将以此为基础展开。2.2 逐步安装MySQL 8.0假设我们在一台新安装的Ubuntu 22.04 LTS系统上操作。第一步更新系统并安装必要工具首先确保你的系统软件包列表是最新的。同时我们安装wget、gnupg等工具用于下载和验证仓库密钥。sudo apt update sudo apt upgrade -y sudo apt install wget gnupg -y第二步添加MySQL官方APT仓库访问MySQL官网的APT仓库配置页面可以找到最新的仓库包。这里我们直接使用MySQL提供的配置包这是最稳妥的方式。# 下载MySQL APT仓库配置包。注意请前往MySQL官网查看最新版本链接。 # 以下链接以8.0为例可能不是最新请替换。 wget https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb # 安装该配置包它会引导你进行一些选择。 sudo dpkg -i mysql-apt-config_0.8.29-1_all.deb运行dpkg命令时会弹出一个文本界面如果是在SSH中请确保终端类型支持。在这个界面里用上下箭头选择MySQL Server Cluster回车。在下一个界面选择你想要的MySQL Server版本例如mysql-8.0然后选择OK。再次选择OK退出配置。这个操作会在/etc/apt/sources.list.d/目录下生成mysql.list文件并添加了GPG密钥。第三步更新软件包列表并安装MySQL Server添加仓库后更新APT列表然后安装。sudo apt update sudo apt install mysql-server -y安装过程中不会像旧版本一样弹出设置root密码的对话框。这是MySQL 8.0在Debian系发行版上的一个重要变化。安装完成后MySQL服务会自动启动并且root用户使用一种叫做auth_socket的插件进行认证。简单说就是系统用户通过Unix socket连接时无需密码。第四步进行初始安全配置虽然服务跑起来了但为了远程访问和安全性我们需要运行一个安全脚本。sudo mysql_secure_installation这个脚本会引导你完成一系列设置验证密码组件询问是否设置密码验证策略。建议选择“是”并选择一个强度等级通常选2即STRONG。设置root密码为root用户设置一个强密码。移除匿名用户是否删除匿名测试用户务必选“是”。禁止root远程登录是否禁止root账户从远程主机登录强烈建议选“是”。日常管理应该使用具有sudo权限的普通MySQL用户。删除测试数据库是否删除名为test的默认测试数据库建议选“是”。重新加载权限表是否立即重新加载权限表使更改生效选“是”。完成这些你的MySQL服务器就有了一个比较安全的基础配置。2.3 安装后的首要操作创建管理用户与基本测试遵循“禁止root远程登录”的安全原则我们创建一个用于日常管理的用户。# 使用root身份登录MySQL。由于是socket认证这里不需要密码。 sudo mysql进入MySQL命令行后执行-- 创建一个新用户例如叫‘admin’并允许其从任何主机连接生产环境应限制IP CREATE USER admin% IDENTIFIED BY 你的强密码; -- 授予这个用户所有数据库的所有权限等同于root但账户名不同 GRANT ALL PRIVILEGES ON *.* TO admin% WITH GRANT OPTION; -- 立即应用权限更改 FLUSH PRIVILEGES; -- 退出 EXIT;现在你就可以用mysql -u admin -p -h 127.0.0.1来远程或本地管理数据库了。进行一个基本连接测试mysql -u admin -p -h 127.0.0.1输入密码后如果能成功进入MySQL命令行并执行SHOW DATABASES;能看到数据库列表说明安装和基本配置成功。注意mysql_secure_installation脚本是交互式的在自动化部署如使用Ansible、Shell脚本时是个麻烦。对于自动化你可以选择在安装后直接用mysql客户端执行SQL命令来达到相同目的或者使用debconf-set-selections在安装前预设这些选项的值。3. 彻底卸载MySQL不留任何“后患”的清理指南当你需要升级大版本、解决无法修复的配置混乱或者单纯地需要移除MySQL时一个彻底的卸载至关重要。下面这个流程我称之为“三步清理法”能确保系统回到安装前的状态。3.1 第一步停止服务并移除软件包首先让MySQL服务停下来。sudo systemctl stop mysql # 有些旧系统或安装方式可能服务名是 mysqld sudo systemctl stop mysqld # 禁止服务开机自启 sudo systemctl disable mysql然后使用apt命令移除MySQL相关的软件包。purge参数是关键它会在删除软件包的同时移除其配置文件。# 移除mysql-server及其配置文件 sudo apt purge mysql-server mysql-client mysql-common mysql-server-core-* mysql-client-core-* -y # 自动移除那些因为依赖关系被安装但现在不再需要的包 sudo apt autoremove -y执行完purgeMySQL的主程序和相关核心包就被移除了/etc/mysql/目录下的配置文件也会被删除。3.2 第二步手动清理残留的数据与日志文件apt purge不会删除用户数据这是为了防止误删。所以我们必须手动清理这些目录。在执行前请务必确认这些目录里的数据已经备份或确定不再需要# 删除MySQL的数据目录默认是/var/lib/mysql sudo rm -rf /var/lib/mysql # 删除MySQL的日志文件错误日志、慢查询日志等通常在/var/log/mysql sudo rm -rf /var/log/mysql # 删除可能的临时文件目录 sudo rm -rf /tmp/mysql*此外检查一下/etc/目录下是否还有残留ls -la /etc/ | grep -i mysql如果还有类似my.cnf或my.cnf.fallback等文件也可以删除/etc/my.cnf有时是全局配置的符号链接或文件。sudo rm -rf /etc/mysql /etc/my.cnf3.3 第三步清理用户、组与APT仓库MySQL安装过程中可能会创建系统用户和组通常是mysql。# 删除mysql用户 sudo userdel -r mysql # 删除mysql用户组 sudo groupdel mysql最后如果你是通过MySQL官方仓库安装的并且确定不再使用可以移除这个仓库避免未来apt update时继续检索它。# 移除仓库列表文件 sudo rm /etc/apt/sources.list.d/mysql.list # 移除GPG密钥具体文件名可能不同通常在/etc/apt/trusted.gpg.d/或/usr/share/keyrings/ sudo rm /etc/apt/trusted.gpg.d/mysql.gpg # 再次更新APT列表 sudo apt update完成以上三步你的系统里关于MySQL的痕迹就基本被抹除了。可以尝试运行which mysql或mysql --version应该提示命令未找到。4. 安装与卸载过程中的核心陷阱与解决方案即使按照标准流程操作也可能会遇到一些“坑”。这里分享几个我踩过并且常见的问题。4.1 安装失败依赖冲突与GPG密钥错误问题1apt update时报告GPG密钥错误。错误信息可能类似The following signatures couldn‘t be verified because the public key is not available: NO_PUBKEY XXXXXXXX这是因为系统没有信任MySQL仓库的签名密钥。解决方法就是手动导入密钥。# 首先尝试从keyserver获取密钥将XXXXXXXX替换为错误信息中的密钥ID sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys XXXXXXXX # 如果上述方法不行可以从MySQL官网下载并添加 wget -O - https://repo.mysql.com/RPM-GPG-KEY-mysql-2023 | sudo apt-key add - # 然后再次更新 sudo apt update问题2安装时出现依赖关系冲突。这通常是因为系统中存在其他软件包如MariaDB或旧版本MySQL的残留与要安装的MySQL包冲突。 首先可以尝试修复依赖sudo apt --fix-broken install如果不行需要先彻底清理所有可能与MySQL冲突的包。一个比较激进但有效的方法是搜索所有名字里带mysql或mariadb的已安装包并purge掉它们操作前请仔细确认列表。dpkg -l | grep -i mysql dpkg -l | grep -i mariadb # 根据输出使用 sudo apt purge 包名 逐一移除清理后再尝试安装。4.2 卸载后重装失败目录权限与残留进程问题彻底卸载后重新安装MySQL在启动服务阶段失败。查看日志sudo journalctl -u mysql.service -xe可能会看到“数据目录/var/lib/mysql已存在但非空”或“无法创建套接字文件”等错误。原因与解决目录权限残留虽然你删除了/var/lib/mysql但它的父目录/var/lib/的权限或SELinux/AppArmor上下文可能被修改过。或者你手动创建了一个同名的空目录但属主不对。解决确保目录不存在让安装程序自己创建。如果存在删除它并检查上级目录权限是否为755 root:root。sudo rm -rf /var/lib/mysql sudo ls -ld /var/lib/残留的mysqld进程极少数情况下可能有僵尸进程仍占用着端口或socket文件。解决用ps aux | grep mysqld查找并kill -9掉它们。AppArmor/SELinux配置如果你修改过这些安全模块的配置可能会阻止新安装的MySQL访问所需目录。解决针对AppArmor可以尝试重新加载MySQL的AppArmor配置。sudo systemctl reload apparmor # 或者查看是否有MySQL相关的配置被禁用 sudo aa-status | grep mysql4.3 安全配置的“后遗症”socket认证与密码插件问题安装后用sudo mysql可以进但mysql -u root -p输入任何密码都报错。这是因为默认使用了auth_socket插件。对于root用户它只允许通过Unix socket连接且不验证密码的系统用户即sudo用户登录。如果你想为root用户设置密码并允许密码登录需要修改认证方式sudo mysql-- 切换到mysql数据库 USE mysql; -- 查看root用户的当前认证插件 SELECT user, host, plugin FROM user WHERE user root; -- 很可能plugin是auth_socket。将其改为mysql_native_password并设置密码 ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的新密码; -- 立即刷新权限 FLUSH PRIVILEGES; EXIT;之后就可以用mysql -u root -p和密码登录了。但请注意从安全角度更推荐使用我们之前创建的admin这类非root管理账户。5. 进阶管理版本切换、多实例与配置优化浅谈掌握了安装和卸载你的MySQL管理能力才算刚入门。在实际生产或复杂开发环境中还有更进阶的需求。5.1 在同一系统上安装/切换不同MySQL版本通过MySQL官方APT仓库你可以安装多个大版本如8.0和8.1的客户端库但服务器实例通常只能运行一个。如果你想测试不同版本有几种方法使用Docker这是最干净、最推荐的方式。每个MySQL实例运行在独立的容器中互不干扰切换版本只需启动不同的容器镜像。docker run --name mysql80 -e MYSQL_ROOT_PASSWORD123456 -p 3306:3306 -d mysql:8.0 docker run --name mysql81 -e MYSQL_ROOT_PASSWORD123456 -p 3307:3306 -d mysql:8.1使用dpkg手动安装不同版本的.deb包并指定不同数据目录和端口非常繁琐需要手动管理多个服务文件、配置和数据目录不推荐。使用mysql-sandbox等工具这类工具可以快速创建隔离的MySQL测试实例。对于大多数场景Docker方案完胜。5.2 关键配置文件my.cnf的解读与基础优化MySQL的配置文件默认位于/etc/mysql/my.cnf它通常会包含其他目录的配置文件如/etc/mysql/conf.d/和/etc/mysql/mysql.conf.d/。对于初学者不建议直接修改主文件而是在/etc/mysql/conf.d/目录下创建一个新文件例如my-custom.cnf。一些基础优化参数适用于小型应用或开发机[mysqld] # 设置默认字符集为utf8mb4支持完整的UTF-8包括emoji character-set-server utf8mb4 collation-server utf8mb4_unicode_ci # 禁用符号链接增强安全性 symbolic-links 0 # 设置最大连接数默认151开发环境可以调高些 max_connections 300 # 设置查询缓存大小为0MySQL 8.0已移除查询缓存此参数在8.0中无效仅作示例。8.0中应关注InnoDB Buffer Pool # query_cache_size 0 # InnoDB缓冲池大小对于有4G内存的开发机可以设置为1G innodb_buffer_pool_size 1G # 设置默认的存储引擎 default-storage-engine InnoDB修改配置后需要重启MySQL服务生效sudo systemctl restart mysql。务必在修改前备份原配置。5.3 备份与数据迁移的简要思路在你执行彻底卸载前备份数据是铁律。最简单的逻辑备份工具是mysqldump。# 备份单个数据库 mysqldump -u admin -p 数据库名 backup.sql # 备份所有数据库包含用户权限等信息 mysqldump -u admin -p --all-databases --single-transaction --master-data2 full_backup.sql恢复数据则使用mysql客户端mysql -u admin -p backup.sql对于大型数据库物理备份直接复制数据文件或使用企业级工具如Percona XtraBackup效率更高。关于“将Oracle数据库表结构及数据迁移到MySQL”这类异构数据库迁移则属于更专业的ETL领域通常需要借助中间工具如MySQL Workbench的迁移向导、阿里云的DTS或自定义脚本来处理数据类型转换、语法差异等问题这是一个独立且复杂的话题。从安装、配置、安全加固到彻底清理、故障排查再到一点进阶管理的思路这套流程覆盖了在Ubuntu上管理MySQL生命周期的核心操作。记住最关键的永远是两点第一理解每个命令背后的意图而不是机械地复制粘贴第二在对生产环境做任何破坏性操作如卸载、修改关键配置前做好备份和预案。
返回列表