Linux上安装 MySQL

前言

上一篇文章中,讲到了在Window上通过绿色版压缩包安装的方式安装MySQL,本文继续讲解在Linux系统环境下安装MySQL。Deepin下安装MySQL三种方式:

**在线安装:**通过命令sudo apt-get install mysql-server在线安装,安装完毕之后已经自动配置好环境变量,可以直接使用,比Window下方便很多;
**二进制包安装:**在网上下载二进制安装包,通过sudo dpkg -i [deb包名]进行安装,安装完毕之后已经自动配置好环境变量,可以直接使用;
**离线安装:**通过下载离线安装包进行配置安装。

在线安装和二进制包安装相对比较简单,不同的Linux发行版本安装命令也各有差异,离线安装的方式通用性相对更强,不同的Linux版本安装方式也大同小异,本文重点也是讲述离线的安装方式。

一、准备工作

1、系统环境

Linux系统的发行版本较多,本此安装是在Deepin 20 Beta环境为例,具体参数如下:
Deepin 20 Beta

Linux version 5.4.50-amd64-desktop linux内核版本号

2、下载安装包

进入MySQL 下载,可以看到mysql的下载包列表。我选择的是8.0.21版本。
Deepin和Ubuntu都是基于Debian的,他们的软件包管理器相同,都用的apt/dpkg,如果是采用第二种方式安装,就下载相应的deb包进行安装,如下图所示。
MySQL 下载

本次安装我是采用通用方式,通过下载离线安装包进行配置安装,下载安装包之前之前首先要查看一下自己系统的glibc版本,然后下载对应的版本。

1
2
sunys@syshlang:~$ getconf GNU_LIBC_VERSION
glibc 2.28

MySQL 下载

二、安装配置

1、解压安装包并授权

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## 解压安装包(方法一)
sunys@syshlang:~/develop$ xz -d mysql-8.0.21-linux-glibc2.17-x86_64-minimal.tar.xz
sunys@syshlang:~/develop$ tar -xvf mysql-8.0.21-linux-glibc2.17-x86_64-minimal.tar
## 或解压安装包(方法二)
sunys@syshlang:~/develop$ tar -Jxf mysql-8.0.21-linux-glibc2.17-x86_64-minimal.tar.xz
## 将解压的文件复制或剪切到自己的软件安装目录下
sunys@syshlang:~/develop$ sudo mv mysql-8.0.21-linux-glibc2.17-x86_64-minimal /usr/local/mysql
## 切换至root
sunys@syshlang:/usr/local/mysql$ su
## 创建mysql的数据文件夹data
root@syshlang:/usr/local/mysql# mkdir data
## 创建mysql_3306.err日志文件(可省略)
root@syshlang:/usr/local/mysql# touch mysql_3306.err
## 设置mysql读写权限
root@syshlang:/usr/local/mysql# chmod -R 777 ./

2、编辑my.cnf文件

1
2
## 编辑my.cnf
root@syshlang:/usr/local/mysql# vim /etc/mysql/my.cnf
/etc/mysql/my.cnf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[client]
port = 3306
socket = /tmp/mysql.sock

[mysqld]
init-connect='SET NAMES utf8'
# 目录
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
#character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
log-error=/usr/local/mysql/mysql_3306.err

详细的配置说明见配置清单

两个重要参数:

  1. lower_case_table_names 是mysql设置大小写是否敏感的一个参数。
  • lower_case_table_names=0 表名存储为给定的大小和比较是区分大小写的
  • lower_case_table_names = 1 表名存储在磁盘是小写的,但是比较的时候是不区分大小写
  • lower_case_table_names=2 表名存储为给定的大小写但是比较的时候是小写的
    unix,linux下lower_case_table_names默认值为 0 .Windows下默认值是 1 .Mac OS X下默认值是 2
  1. sql_mode设置
  • 通过设置SQL Mode,可以完成不同严格程度的数据校验,保障数据准确性。
  • 通过设置SQL Mode为ANSI,保证大多数SQL符合标准的SQL语法。
  • 通过设置SQL Mode,可以使MySQL上的数据更方便的迁移到目标数据。

3、创建用户和用户组并授权

1
2
3
4
5
6
## 添加mysql用户组
root@syshlang:/usr/local/mysql# groupadd mysql
## 添加mysql用户
root@syshlang:/usr/local/mysql# useradd -r -g mysql mysql
## 授权
root@syshlang:/usr/local/mysql# chown -R mysql:mysql ./

4、初始化数据库

1
2
root@syshlang:/usr/local/mysql# cd bin/
root@syshlang:/usr/local/mysql# ./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

不错喔!我初始化的时候没有报错,如果报错,可以去mysql_3306.err文件查看错误信息
初始化数据库
初始化完成,mysql会自动生成一个初始化密码,可以去日志文件查看,保存这个密码一会会用的到。
日志文件

5、将MySQL服务添加到系统服务

1
2
3
4
## 将mysql的启动服务文件复制到init.d目录
root@syshlang:/usr/local/mysql# cp -r support-files/mysql.server /etc/init.d/mysqld
## 修改配置
root@syshlang:/usr/local/mysql# vim /etc/init.d/mysqld

配置系统服务文件

6、配置环境变量

1
2
## 编辑profile文件
root@syshlang:/usr/local/mysql# vim /etc/profile

文件末尾追加配置
export PATH=$PATH:/usr/local/mysql/bin:/usr/local/mysql/sbin

1
2
## 刷新资源
root@syshlang:/usr/local/mysql# source /etc/profile

7、修改默认密码

1
2
3
4
## 启动MySQL服务
root@syshlang:/usr/local/mysql# /etc/init.d/mysqld start
## 使用临时密码登陆数据库
root@syshlang:/usr/local/mysql# mysql -uroot -p

使用临时密码登陆数据库

1
2
3
4
5
6
## 修改数据库的密码
mysql> ALTER user 'root'@'localhost' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.13 sec)
## 刷新权限表
mysql> flush privileges;
Query OK, 0 rows affected (0.03 sec)

到此,MySQL的安装就结束了,针对MySQL的更改host名,配置权限等与在windows下是一样的,可以参考《Windows上安装 MySQL》

三、其他相关命令

启动/停止/重启/启动状态

1
2
3
4
5
6
7
8
## 使用 service
root@syshlang:/usr/local/mysql# service mysql [start|stop|restart|status]
## 使用 mysqld 脚本
root@syshlang:/usr/local/mysql# /etc/init.d/mysqld [start|stop|restart|status]
## 使用 safe_mysqld启动
root@syshlang:/usr/local/mysql# safe_mysql&
## MySQL管理工具mysqladmin停止
mysqladmin shutdown

附:配置清单

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
[client]
port = 3306
socket = /dev/shm/mysql.sock
[mysqld]
port = 3306
socket = /dev/shm/mysql.sock
basedir = /usr/local/mysql
datadir = /deepin/userdata/data/mysqldata
pid-file = /deepin/userdata/data/mysqldata/mysql.pid
user = mysql
bind-address = 0.0.0.0
server-id = 1
init-connect = 'SET NAMES utf8mb4'
character-set-server = utf8mb4
#skip-name-resolve
#skip-networking
back_log = 300
max_connections = 1000
max_connect_errors = 6000
open_files_limit = 65535
table_open_cache = 128
max_allowed_packet = 4M
binlog_cache_size = 1M
max_heap_table_size = 8M
tmp_table_size = 16M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
sort_buffer_size = 8M
join_buffer_size = 8M
key_buffer_size = 4M
thread_cache_size = 8
query_cache_type = 1
query_cache_size = 8M
query_cache_limit = 2M
ft_min_word_len = 4
log_bin = mysql-bin
binlog_format = mixed
expire_logs_days = 30
log_error = /usr/local/mysql/logs/mysql-error.log
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /usr/local/mysql/logs/mysql-slow.log
performance_schema = 0
explicit_defaults_for_timestamp

lower_case_table_names = 1
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
skip-external-locking
default_storage_engine = InnoDB
#default-storage-engine = MyISAM
innodb_file_per_table = 1
innodb_open_files = 500
innodb_buffer_pool_size = 64M
innodb_write_io_threads = 4
innodb_read_io_threads = 4
innodb_thread_concurrency = 0
innodb_purge_threads = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 2M
innodb_log_file_size = 32M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
bulk_insert_buffer_size = 8M
myisam_sort_buffer_size = 8M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1
interactive_timeout = 28800
wait_timeout = 28800
[mysqldump]
quick
max_allowed_packet = 16M
[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
read_buffer = 4M
write_buffer = 4M
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
[mysqld]
user = mysql
port = 3306
socket = /data/3306/mysql.sock,#这里指定了一个特别的连接
basedir = /usr/local/mysql
datadir = /data/3306/data
[client]
port = 3306
socket = /data/3306/mysql.sock,在客户端也要声明它,命令行要用到
3. 查询缓存要不要开
写入频繁的数据库,不要开查询缓存
query_cache_size
查询缓存区的最大长度(默认设置是0,不开辟查询缓存区)。首先要把Query_cache和该表相关的语句全部置为失效,然后在写入更新。那么如果Query_cache非常大,该表的查询结构又比较多,查询语句失效也慢,一个更新或是Insert就会很慢,这样看到的就是Update或是Insert怎么这么慢了。所以在数据库写入量或是更新量也比较大的系统,该参数不适合分配过大。而且在高并发,写入量大的系统,建议把该功能禁掉。
query_cache_limit
指定单个查询能够使用的缓冲区大小,缺省为1M
query_cache_min_res_unit
默认是4KB,设置值大对大数据查询有好处,但如果你的查询都是小数据查询,就容易造成内存碎片和浪费
说明:禁掉查询缓存的方法就是直接注释掉查询缓存的配置,如#query_cache_size=1M, 这样就可以了
4. 其他需要开的缓存
读缓存,线程缓存,排序缓存
sort_buffer_size = 2M
connection级参数。太大将导致在连接数增高时,内存不足。
max_allowed_packet = 32M
网络传输中一次消息传输量的最大值。系统默认值 为1MB,最大值是1GB,必须设置1024的倍数。
join_buffer_size = 2M
和sort_buffer_size一样,该参数对应的分配内存也是每个连接独享
tmp_table_size = 256M
默认大小是 32M。GROUP BY 多不多的问题
max_heap_table_size = 256M
key_buffer_size = 2048M
索引的缓冲区大小,对于内存在4GB左右的服务器来说,该参数可设置为256MB或384MB。
read_buffer_size = 1M
read_rnd_buffer_size = 16M
进行排序查询时,MySql会首先扫描一遍该缓冲,以避免磁盘搜索
bulk_insert_buffer_size = 64M
批量插入数据缓存大小,可以有效提高插入效率,默认为8M
Innodb缓存
innodb_buffer_pool_size = 2048M
只需要用Innodb的话则可以设置它高达 70-80% 的可用内存。一些应用于 key_buffer 的规则有 ——如果你的数据量不大,并且不会暴增,那么无需把innodb_buffer_pool_size 设置的太大了。
innodb_additional_mem_pool_size = 16M
网络传输中一次消息传输量的最大值。系统默认值为1MB,最大值是1GB,必须设置1024的倍数。
innodb_log_files_in_group = 3
循环方式将日志文件写到多个文件。推荐设置为3
innodb_lock_wait_timeout = 120
InnoDB 有其内置的死锁检测机制,能导致未完成的事务回滚。innodb_file_per_table = 0 独享表空间,关闭
5. 连接数
open_files_limit = 10240
允许打开的文件数
back_log = 600
短时间内的多少个请求可以被存在堆栈中
max_connections = 3000
MySQL默认的最大连接数为100,MySQL服务器允许的最大连接数16384
max_connect_errors = 6000
设置每个主机的连接请求异常中断的最大次数,当超过该次数,MYSQL服务器将禁止host的连接请求
thread_cache_size = 300
重新利用保存在缓存中线程的数量
thread_concurrency = 8
thread_concurrency应设为总CPU核数的2倍
thread_stack = 192K
每个线程的堆栈大小,默认值足够大,可满足普通操作。可设置范围为128K至4GB,默认为192KB。
6. 线程池有关参数
线程池很少配
thread_handling
表示线程池模型。
thread_pool_size
表示线程池的group个数,一般设置为当前CPU核心数目。理想情况下,一个group一个活跃的工作线程,达到充分利用CPU的目的。
thread_pool_stall_limit
用于timer线程定期检查group是否“停滞”,参数表示检测的间隔。
thread_pool_idle_timeout
当一个worker空闲一段时间后会自动退出,保证线程池中的工作线程在满足请求的情况下,保持比较低的水平。60秒
thread_pool_oversubscribe
该参数用于控制CPU核心上“超频”的线程数。这个参数设置值不含listen线程计数。
threadpool_high_prio_mode
表示优先队列的模式。
thread_pool_max_threads
限制线程池最大的线程数,超过将无法再创建更多的线程,默认为100000。
thread_pool_high_prio_tickets
最多语序多少次被放入高优先级队列中,默认为4294967295。只有在thread_pool_high_prio_mode为transactions的时候才有效果
说明:
线程处理的最小单位是statement(语句)
线程池实现在server端,通过创建一定数量的线程服务DB请求,相对于one-conection-per-thread的一个线程服务一个连接的方式,线程池服务的最小单位是语句,即一个线程可以对应多个活跃的连接。
7. 慢查询日志
slow_query_log
是否开启慢查询日志,1表示开启,0表示关闭。
log-slow-queries
旧版(5.6以下版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log
slow-query-log-file
新版(5.6及以上版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log
long_query_time
慢查询阈值,当查询时间多于设定的阈值时,记录日志。
log_queries_not_using_indexes
未使用索引的查询也被记录到慢查询日志中(可选项)。
log_output
日志存储方式。log_output='FILE'表示将日志存入文件,默认值是'FILE'。log_output='TABLE'表示将日志存入数据库,这样日志信息就会被写入到mysql.slow_log表中。MySQL数据库支持同时两种日志存储方式,配置的时候以逗号隔开即可,如:log_output='FILE,TABLE'。日志记录到系统的专用日志表中,要比记录到文件耗费更多的系统资源,因此对于需要启用慢查询日志,又需要能够获得更高的系统性能,那么建议优先记录到文件。
log-error
mysql生成的错误日志存放的路径,它是一个文本文件