# MySQL 安装与初始化 ## 场景 新服务器要装 MySQL,给内部应用用。要能远程连、字符集正确、开机自启。 ## 前置条件 - 知道应用连过来的网段 - 磁盘规划好:数据目录别放系统盘 - 确认没有装过 MariaDB 或旧版本(会冲突) ## 配置 ```bash # CentOS / Rocky / 麒麟 dnf install -y mysql-server systemctl enable --now mysqld # Ubuntu / Debian apt install -y mysql-server # 取初始密码 grep 'temporary password' /var/log/mysqld.log # 安全初始化:改密码、删匿名用户、禁 root 远程 mysql_secure_installation ``` 字符集(8.0 默认 `utf8mb4`,5.7 要手动改): ```ini [mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_0900_ai_ci default-time-zone = '+08:00' max_connections = 500 ``` ```bash systemctl restart mysqld ``` 建业务账号: ```sql CREATE DATABASE appdb DEFAULT CHARACTER SET utf8mb4; CREATE USER 'app'@'10.0.0.%' IDENTIFIED BY '强密码'; GRANT ALL PRIVILEGES ON appdb.* TO 'app'@'10.0.0.%'; FLUSH PRIVILEGES; ``` ## 验证 ```bash systemctl status mysqld mysql -u root -p -e "SELECT VERSION(); SHOW VARIABLES LIKE 'character_set_server';" mysql -h 10.0.0.5 -u app -p -e "SELECT 1;" ss -lntp | grep 3306 ``` ## 回滚 ```bash systemctl disable --now mysqld dnf remove -y mysql-server rm -rf /var/lib/mysql ``` ## 坑 - **数据目录放系统盘**,日志一多就把根分区写满。 - 5.7 默认 `latin1`,建库不改字符集,中文全靠运气。 - `bind-address` 默认只有 `127.0.0.1`,远程连不上。 - 防火墙/安全组没开 3306,应用一直超时。 - root 只允许本地登录是默认安全策略,不要图省事开远程。 - 时区不对会导致 `NOW()` 差 8 小时,写进业务数据的都是错的时间。