mysql新建数据库(100% 硬核干货!MySQL 安装 + 配置 + 初始化 + 启停 + 改密 + 权限,一文讲透)

mysql新建数据库(100% 硬核干货!MySQL 安装 + 配置 + 初始化 + 启停 + 改密 + 权限,一文讲透)
100% 硬核干货!MySQL 安装 + 配置 + 初始化 + 启停 + 改密 + 权限,一文讲透

很多人安装 MySQL 只会用 yum 一键安装,真到了生产环境、自定义路径、多实例部署就频频踩坑:权限不对、启动失败、密码登不上、连接被拒绝……

这篇文章不讲花里胡哨,只讲 最规范、最安全、符合审计要求的二进制安装实战。从解压、配置、初始化、启停、改密到权限控制,一步一步带你走通,照着做就能直接上线,新手也能轻松学会!


1、预编译的二进制文件解压、改名

安装MySQL有多种方式,yum、二进制、docker等,下面以二进制文件安装方式进行说明

# 进入/home目录cd /home# 解压tar -xvf mysql-8.0.40-linux-glibc2.28-x86_64.tar.xz# 改名,简单的名好记录mv mysql-8.0.40-linux-glibc2.28-x86_64 mysql8# 创建临时目录mkdir /home/mysql8/temp

2、在 /home/mysql8 下新建 my.cnf,配置核心参数。

# 服务端核心配置[mysqld]basedir=/home/mysql8datadir=/home/mysql8/data socket=/home/mysql8/mysql.socklog-error=/home/mysql8/error.logtmpdir=/home/mysql8/tmpport=3308character-set-server=utf8mb4# 建议配置max_connections=2000innodb_buffer_pool_size=8Ginnodb_flush_log_at_trx_commit=1sync_binlog=1transaction-isolation=READ-COMMITTEDmax_execution_time=10000 # 客户端通用配置[client]default-character-set=utf8mb4socket=/home/mysql8/mysql.sock

说明

A、basedir:MySQL的基本目录;使用系统包管理器(如 yum、apt)安装MySQL可以不配置, 这类安装方式会将 MySQL 核心文件放在系统默认路径(如 /usr/local/mysql、/usr/bin 等),MySQL 启动时会自动识别这些默认路径 ;自定义安装路径强烈建议配置。

B、datadir:数据目录;后面建的数据库、表等业务数据都放这下面,要找个大盘。

C、socket: 定义本地客户端(特别是 mysql 命令行)连接 MySQL 的 Unix 套接字文件路径, 比 TCP/IP 协议(127.0.0.1:3306)更高效,是本地高效通信的核心配置。

D、log-error: 指定 MySQL 错误日志文件 的存放路径,是 MySQL 中最核心的日志配置之一 。若不配置则使用默认路径(如 /var/log/mysqld.log 或 /var/log/mysql/error.log)。

E、tmpdir: 指定 MySQL 临时文件的存放目录, 执行 ORDER BY、GROUP BY、DISTINCT 等语句时,若结果集超出 sort_buffer_size 内存限制,会生成临时排序文件,就放在此处。 多 MySQL 实例部署时,为每个实例配置独立的 tmpdir,避免不同实例的临时文件相互干扰、抢占磁盘资源。

F、上面的 【建议配置】不是必须的,但影响MySQL的性能和安全,建议根据实际情况进行配置。具体意义及更多参数配置见作者的另一篇文章《MySQL 30 个配置改完 TPS 翻 10 倍,结果内存纹丝不动:60% 稳如老狗》。


3、新建系统用户组及用户 mysql,用于启动 MySQL 服务

useradd -r -U -s /bin/false mysqlchown -R mysql:mysql /home/mysql8

A、-s /bin/false 表示设置用户的登录 Shell 为 /bin/false,即禁止该用户交互式登录系统,也就是说该用户是 "工具人",只能后台跑服务,不能登录系统搞事情。

B、考虑到安全、规范 和 审计要求,务必用专门的系统用户(如 mysql)启动mysql。不过,只是用系统用户mysql启动MySQL服务即可,下面的操作都是由 root 完成的。


4、初始化数据库(之前可能需要安装依赖包)

初始化数据库的作用是为空白 datadir(数据目录)创建系统库、系统表、默认用户、核心文件,完成实例的 初始化配置 。


初始化步骤

1. 检查前置条件(失败则终止)

A、检查 my.cnf 中指定的 datadir(数据目录)是否为空;如不为空则直接报错退出。

B、检查 --user 指定的用户对 datadir 目录是否有读写权限;如没有则直接报错退出。

C、验证配置文件的合法性:比如 port、socket 等核心参数是否合法;如不合法则直接报错退出。

2. 创建核心目录与文件

A、在 datadir 下创建系统库目录:mysql/(存储用户、权限相关表)、sys/(系统视图)、performance_schema/(性能监控)、information_schema/(元数据,内存表);

B、生成 InnoDB 核心文件:ibdata1(共享表空间)、ib_logfile0/ib_logfile1(重做日志)、auto.cnf(实例唯一 UUID);

C、创建临时文件目录(如 tmpdir 指定的目录),并设置正确的权限。

3. 初始化系统表(最核心)

向 mysql 库中写入基础表结构和数据。创建 user、db、tables_priv、columns_priv 等 30+ 个权限表;创建 plugin、procs_priv 等插件 / 存储过程权限表;初始化 information_schema(内存表,无需磁盘文件,记录元数据)。

4. 初始化插件与系统变量

A、加载默认认证插件(MySQL 8.0 默认为 caching_sha2_password);

B、初始化系统变量(如 max_connections、innodb_buffer_pool_size),优先使用 my.cnf 中的配置,无配置则用默认值 (如 max_connections=151、innodb_buffer_pool_size=128M) 。


初始化命令

/home/mysql8/bin/mysqld --defaults-file=/home/mysql8/my.cnf --initialize --user=root

说明:

A、初始化动作仅允许对 空的data目录 才能执行,若检测到目录内有文件(哪怕是之前初始化残留的系统文件、或你创建的业务数据文件),都会直接报错终止,避免误操作覆盖已有数据。

B、--initialize 会创建指定用户root,生成临时密码在 error.log 里用于首次登录 MySQL,登录后必须修改密码;还可以改为 --initialize-insecure,会创建指定用户root,密码为空。

C、上面用专门的系统用户 mysql 启动的MySQL服务,这里务必以 mysql 来初始化。

D、从 my.cnf 里读取参数,如 datadir、max_connections等,还可以在命令里直接设置


5、启动MySQL

启动MySQL有多种方式,下面从mysqld、mysqld_safe、service、systemctl 4种方式说明:

mysqld

启动命令:/home/mysql8/mysqld --defaults-file=/home/mysql8/my.cnf &

关闭命令:/home/mysql8/bin/mysqladmin -S /home/mysql8/mysql.sock -uroot -p shutdown

特点:直接启动MySQL,无进程监控,日志需手动配置。


mysqld_safe

启动命令:/home/mysql8/mysqld_safe --defaults-file=/home/mysql8/my3306.cnf --user=root &

关闭命令:/home/mysql8/bin/mysqladmin -S /home/mysql8/mysql.sock -u root -p shutdown

特点:自动重启崩溃的 mysqld,日志自动重定向到文件。


service

配置service启动:

vim /home/mysql8/support-files/mysql.server

修改数据目录 datadir=/home/mysql8/data

cp /home/mysql8/support-files/mysql.server /etc/init.d/mysqld8

启动命令:service mysqld8 start

关闭命令:service mysqld8 stop


systemctl

配置systemctl启动方式:
vim /etc/systemd/system/mysqld8.service

[Unit]Description=MySQL Server byDocumentation=man:mysqld(8)Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.htmlAfter=network.targetAfter=syslog.target[Install]WantedBy=multi-user.target[Service]User=mysqlGroup=mysqlExecStart=/home/mysql8/bin/mysqld --defaults-file=/home/mysql8/my.cnfLimitNOFILE = 5000

启动命令:systemctl start mysqld8.service

关闭命令:systemctl stop mysqld8.service


启动顺序

service --> mysqld_safe --> mysqld -->启动mysql

systemctl --> mysqld -->启动mysql

mysqld_safe --> mysqld -->启动mysql

mysqld --> 启动mysq

A、上面4种方式最终都是使用 mysqld 进行启动MySQL的,如果没有走到 mysqld 这一步,是不会记录mysql的错误日志文件中。

B、/home/mysql8/bin/mysqladmin -S /home/mysql8/mysql.sock -u root -p shutdown

上面这是通过 sock文件停止,效率最高;还可以通过 TCP/IP网络协议停止,需协议转换,稍慢,如下:

/home/mysql8/bin/mysqladmin -u root -p -P localhost -h 3306 shutdown

C、生产环境建议以 systemctl 方式启停。


6、使用临时密码登录MySQL,并修改密码

修改管理员密码有如下两种方式:

方式一

alter user root@'localhost' identified WITH mysql_native_password  by '新密码';

说明:

mysql新建数据库(100% 硬核干货!MySQL 安装 + 配置 + 初始化 + 启停 + 改密 + 权限,一文讲透)

A、WITH mysql_native_password;指定用户认证插件 (MySQL8默认使用 caching_sha2_password 认证插件,一些老版本的客户端工具不支持)。

B、执行完无需执行flush privileges。

方式二

/home/mysql8/bin/mysqladmin -uroot -p旧密码 password '新密码' -S /home/mysql8/mysql.sock

说明:执行完无需执行flush privileges。


7、允许固定机器通过root连接当前MySQL

/home/mysql8/bin/mysql -u root -p --socket=/home/mysql8/mysql.sockuse mysql;update user set host='限制IP' where user='root';GRANT ALL PRIVILEGES ON *.* TO 'root'@'限制IP' WITH GRANT OPTION;FLUSH PRIVILEGES;  

说明:

A、由于这里直接使用 DML 修改了表 user 数据,没有修改内存数据,故需执行 flush。

B、root 用户权限过大,生产环境建议限制固定的IP才能使用 root 连接数据库。

C、root 用户主要是给 DBA 使用的。


8、为业务系统创建用户,并授予其某数据库的访问权限

-- 创建用户 elkCREATE USER 'elk'@'%' IDENTIFIED BY '实际密码';-- 授予用户 elk 对数据库 csm 的读写权限GRANT ALL PRIVILEGES ON csm.* TO 'elk'@'%';

说明:elk 这种用户是专门给业务系统使用的,权限有限。业务系统不使用 root 用户,这里就实现了 DBA 和 业务 的权限配置,保证了数据库的安全。


总结

按照上面的步骤,我们收货了一个安全且高性能 MySQL服务,又可以了解每一步的意义和细节。

文章版权声明:除非注明,否则均为边学边练网络文章,版权归原作者所有