MySQL安装

警告
本文最后更新于 2021-06-18,文中内容可能已过时。

MySQL 是最好的 RDBMS(Relational Database Management System:关系数据 库管理系统)应用软件之一。

环境:CentOS 7 64位

本教程安装MySQL是通过编译过的二进制文件进行安装。是不针对特定平台的通用安装方法,使用的二进制文件是后缀为.tar.gz的压缩文件

下载页面

https://img.bwcxtech.com/img/20200928164458.png

1
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.29-linux-glibc2.12-x86_64.tar.gz

解压缩到/usr/local/下面,mysql的主目录命名为mysql

1
2
tar zxf mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
mv mysql-5.7.22-linux-glibc2.12-x86_64 /usr/local/mysql
1
yum -y remove mariadb-libs.x86_64

在mysql下面创建数据库文件目录

1
2
mkdir -p /usr/local/mysql/{data,logs}
touch /usr/local/mysql/logs/error.log

创建mysql的用户组和用户,并对mysql目录设置用户组和用户

1
2
3
groupadd --system mysql
useradd --system -g mysql -d /usr/lib/mysql -s /sbin/nologin -c "Mysql server" mysql
chown -R mysql.mysql /usr/local/mysql

根据需要添加配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
[client]
port = 3306
socket = /usr/local/mysql/mysql.sock	#套接字文件
default-character-set = utf8mb4

[mysqld]
#dir
basedir = /usr/local/mysql	#Mysql安装路径
datadir = /usr/local/mysql/data	#Mysql数据存放路径
tmpdir = /tmp
log-error = /usr/local/mysql/logs/error.log	#mysql生成的错误日志
slow_query_log_file = /usr/local/mysql/logs/slow.log
general_log_file = /usr/local/mysql/logs/general.log
socket = /usr/local/mysql/mysql.sock	#套接字文件,客户端需与服务端一致
pid-file = /usr/local/mysql/mysql.pid	#pid文件
event_scheduler = 1 #开启事件调度器

#innodb
#innodb_data_home_dir = #InnoDB所有共享表空间数据文件的目录路径。
#innodb_data_file_path = ibdata1:12M;/data/mysql/ibdata2:12M:autoextend #指定InnoDB的各个数据文件及其大小,文件多于一个时彼此间用分号隔开。
innodb_buffer_pool_size = 512M #innodb缓存区大小

#server
user = mysql
port = 3306
skip-ssl #禁用ssl
skip-name-resolve #禁用dns解析
character_set_server = utf8mb4	#默认字符集
collation_server = utf8mb4_bin	#默认排序规则
default-time-zone = '+08:00'	#默认时区
default-storage-engine = INNODB	#默认存储引擎INNODB
lower_case_table_names = 1	#不区分大小写
slow_query_log = 1 #开启慢查询日志
long_query_time = 10 #指定多少秒返回查询的结果为慢查询,单位秒。默认为10秒
general_log = 0 #关闭通用日志
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

#binlog
log-bin = /usr/local/mysql/logs/mysql-bin	#二进制日志,binlog用于记录用户对数据库操作的SQL语句信息
server-id = 1
binlog-format = ROW
expire_logs_days = 30 #保留30天
max_binlog_size = 100M	#binlog每个日志文件大小

[mysql]
no-auto-rehash	#命令补全
default-character-set = utf8mb4

初始化mysql并启动mysql服务

1
yum -y install libaio
1
2
cd /usr/local/mysql
./bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

在log-error中可以看到临时密码

1
grep 'temporary password' /usr/local/mysql/logs/error.log

https://img.bwcxtech.com/img/20200928164446.png

1
./bin/mysql_ssl_rsa_setup --datadir=/usr/local/mysql/data

配置服务,使用systemctl管理

1
vi /usr/lib/systemd/system/mysql.service
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[Unit]
Description=MySQL Server
Documentation=man:mysqld(5.7)
Documentation=https://dev.mysql.com/doc/refman/5.7/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target
Alias=mysql.service

[Service]
User=mysql
Group=mysql
Type=forking
# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=5
# Execute pre and post scripts as root
PermissionsStartOnly=true
# Start main service
ExecStart=/usr/local/mysql/bin/mysqld --daemonize --defaults-file /usr/local/mysql/my.cnf
Restart=on-failure
RestartPreventExitStatus=1
PrivateTmp=false
1
systemctl start mysql.service

将MySQL命令添加环境变量

1
2
3
4
5
#set mysql environment
export MYSQL_HOME=/usr/local/mysql
export PATH=${PATH}:${MYSQL_HOME}/bin

source /etc/profile

使用临时密码登陆并修改密码

1
mysql -uroot -p

修改MySQL的root密码,新密码在此为’root'

1
mysql> set password=password('root');

设定远程登录MySQL。在Linux下为了安全,默认是不允许MySQL本机以外的机器访问MySQL数据库服务,因此需要重新授权root。方便远程访问。

1
2
3
4
mysql> use mysql;
mysql> select Host,User from user;
mysql> GRANT ALL PRIVILEGES ON *.* TO root@'%' identified by 'root';
mysql> flush privileges;
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
docker run -d \
    --name mysql \
	-e MYSQL_DATABASE=db \
	-e MYSQL_ROOT_PASSWORD=root \
	-e TZ=Asia/Shanghai \
	-v /data/mysql/data:/var/lib/mysql \
	mysql:5.7.32 \
	--skip-ssl \
	--default-time-zone=+8:00 \
	--lower_case_table_names=1 \
	--character-set-server=utf8mb4 \
	--collation-server=utf8mb4_unicode_ci \
	--sql-mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION