本教程以MySQL8为主版本(兼容MySQL5.7)。
所有MySQL文章的目录为:总目录 【MySQL8教程】:总目录_zyplanke的专栏-CSDN博客
MySQL安装可分为:RPM安装、通用二进制安装、源代码安装。本文先介绍了基于RPM安装MySQL(简单易学,适合初学者),然后介绍了二进制安装(推荐)。 本文以MySQL 8.0.18为例,详细说明在Linux上采用RPM方式安装的过程。
本文的安装方法和命令无特别说明则适用于RHEL / Oracle Linux / CentOS。其他 如SLES / Fedora也可参考 。更多系统和其他安装方式,请参考官方文档:MySQL :: MySQL 8.0 Reference Manual
目录
1、安装前准备
- OS:CentOS 7.7 x86_64 (1908版)
- MySQL:社区版 8.0.18 x86_64 介质
RPM包下载地址:https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.18-1.el7.x86_64.rpm-bundle.tar
二进制包下载地址(根据自己Linux上的glibc版本选择):https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.18-linux-glibc2.12-x86_64.tar.xz
2、RPM方式安装
RPM安装与二进制安装两选一即可,不要在同一台机器两种方式都安装,避免冲突。
2.1、Rpm Packages列表
MySQL 8 社区版(Community Edition)的RPM软件包(来源自官方文档)
RPM包名字 | 摘要 |
---|---|
mysql-community-client | MySQL客户端应用程序和工具 |
mysql-community-common | 服务器和客户端库的通用文件 |
mysql-community-devel | MySQL数据库客户端应用程序的开发头文件和库 |
mysql-community-embedded-compat | MySQL服务器作为嵌入式库,与使用库版本18的应用程序兼容 |
mysql-community-libs | MySQL数据库客户端应用程序的共享库 |
mysql-community-libs-compat | 以前的MySQL安装的共享兼容性库 |
mysql-community-server | 数据库服务器和相关工具 |
mysql-community-server-debug | 调试服务器和插件二进制文件 |
mysql-community-test | MySQL服务器的测试套件 |
mysql-community | RPM的源代码,名字类似于mysql-community-8.0.20-1.el7.src.rpm,具体取决于所选的OS |
如果是MySQL 8 企业版(Enterprise Edition), 则RPM软件包为:
RPM包名字 | 摘要 |
---|---|
mysql-commercial-backup | MySQL企业备份(8.0.11中添加) |
mysql-commercial-client | MySQL客户端应用程序和工具 |
mysql-commercial-common | 服务器和客户端库的通用文件 |
mysql-commercial-devel | MySQL数据库客户端应用程序的开发头文件和库 |
mysql-commercial-embedded-compat | MySQL服务器作为嵌入式库,与使用库版本18的应用程序兼容 |
mysql-commercial-libs | MySQL数据库客户端应用程序的共享库 |
mysql-commercial-libs-compat | 以前的MySQL安装的共享兼容性库;库的版本与您使用的发行版默认安装的库的版本匹配 |
mysql-commercial-server | 数据库服务器和相关工具 |
mysql-commercial-test | MySQL服务器的测试套件 |
2.2、安装RPM(使用root用户)
- MySQL需要依赖libaio、net-tools、perl等软件,确保已将这些软件安装就绪,可以通过rpm -aq 查询操作系统当前已经安装的软件。
- 本节步骤需使用root用户,或者具有sudo权限的用户(在命令前加sudo执行)
- 将下载的MySQL安装介质mysql-8.0.18-1.el7.x86_64.rpm-bundle.tar 放到某个目录,本文放到 /tmp/mysql_install_pkgs 目录下。然后解压
# cd /tmp/mysql8_rpm_packages # tar -xvf mysql-8.0.18-1.el7.x86_64.rpm-bundle.tar
- 在大多数情况下,只需要安装
mysql-community-server
,mysql-community-client
,mysql-community-libs
,mysql-community-common
,和mysql-community-libs-compat
包, 作为标准的MySQL安装。 - 通过以下命令安装
# rpm -ivh mysql-community-{server,client,common,libs}*
如果报:libaio、net-tools、perl这些依赖包,则先按照这些对应的包。可以先下载,再用rpm安装这些依赖包。如果Linux能联网还可以直接通过命令yum install 进行安装。
如果报error: Failed dependencies mariadb-server is obsoleted by mysql-community-server..... 等等之类的错误。是因为系统已有的mariadb与MySQL冲突,通过以下命令删除冲突的mariadb包,然后再用上步命令执行。
# rpm -qa |grep mariadb |xargs rpm -e --nodeps
# rpm -qa |grep mysql |xargs rpm -e --nodeps
2.3、RPM安装后目录结构
标准安装后的文件位置 MySQL Installation Layout for Linux RPM Packages
Files or Resources | Location |
---|---|
Client programs and scripts | /usr/bin |
mysqld server | /usr/sbin |
Configuration file | /etc/my.cnf |
Data directory | /var/lib/mysql |
Error log file | For RHEL, Oracle Linux, CentOS or Fedora platforms: For SLES: |
Value of secure_file_priv | /var/lib/mysql-files |
System V init script | For RHEL, Oracle Linux, CentOS or Fedora platforms: For SLES: |
Systemd service | For RHEL, Oracle Linux, CentOS or Fedora platforms: For SLES: |
Pid file | /var/run/mysql/mysqld.pid |
Socket | /var/lib/mysql/mysql.sock |
Keyring directory | /var/lib/mysql-keyring |
Unix manual pages | /usr/share/man |
Include (header) files | /usr/include/mysql |
Libraries | /usr/lib/mysql |
Miscellaneous support files (for example, error messages, and character set files) | /usr/share/mysql |
提醒:RPM安装时会自动在系统上创建一个名为的用户 mysql
和一个名为的组 mysql
。(因为仅出于文件和进程所有者目的,而不是登录用途才创建该用户,所以该用户没有登录权限)
2.4、字符集设置
对于MySQL8 默认字符集已经是utf8mb4,所以无需再设置字符集。
对于MySQL 5.7或更低版本 :
因为默认server端的字符集(character)为:latin1。为兼容中文,强烈建议在启动数据库前,先修改server端的字符集为utf8mb4。打开MySQL server端的配置文件/etc/my.cnf。在[mysqld]和[client]下面各增加一行。 (如果没有[client] 这一行, 则手工增加, client配置包括mysql客户端的所有客户端)然后保存:
[mysqld]
character-set-server=utf8mb4
...
...
[client]
default-character-set=utf8mb4
...
...
题外话:由于MySQL的历史遗留问题,MySQL历史版本中的utf8等于utf8mb3,不是utf8mb4,所以在MySQL中需要具体指定为utf8mb4。 两者一般情况下中英文都没有问题,但utf8mb4可以比utf8mb3多存放 Emoji 表情(Emoji常见于手机等移动终端)和很多不常用的汉字。而且MySQL8.0默认字符集就是utf8mb4则无须特别设置。 同时注意一点,许多人一直认为utf8字符集的汉字是固定占3个字节。虽然大多数情况是对的,但也有占用4个字节的情况!!!
2.5、启动MySQL
在安装过程结束时,不会自动启动MySQL。
本节步骤需使用root用户,或者具有sudo权限的用户(在命令前加sudo执行)
- 对于Red Hat Enterprise Linux,Oracle Linux,CentOS和Fedora系统,使用以下命令来启动MySQL
# service mysqld start
- 对于SLES系统,命令相同,但是服务名称不同:
# service mysql start
- 启动后,通过ps命令可以看到当前mysqld进程信息。而且可以看到尽管是用root启动,但进程的所属用户为mysql。mysql使用的文件的文件属主也是mysql用户。
[root@centosa ~]# ps -ef | grep mysqld mysql 2570 1 2 11:45 ? 00:00:01 /usr/sbin/mysqld root 2745 2691 0 11:46 pts/0 00:00:00 grep --color=auto mysqld [root@centosa ~]# ls -l /var/lib/mysql total 168004 -rw-r-----. 1 mysql mysql 56 Dec 17 11:45 auto.cnf -rw-r-----. 1 mysql mysql 155 Dec 17 11:45 binlog.000001 -rw-r-----. 1 mysql mysql 16 Dec 17 11:45 binlog.index -rw-------. 1 mysql mysql 1676 Dec 17 11:45 ca-key.pem -rw-r--r--. 1 mysql mysql 1112 Dec 17 11:45 ca.pem -rw-r--r--. 1 mysql mysql 1112 Dec 17 11:45 client-cert.pem -rw-------. 1 mysql mysql 1680 Dec 17 11:45 client-key.pem -rw-r-----. 1 mysql mysql 5892 Dec 17 11:45 ib_buffer_pool -rw-r-----. 1 mysql mysql 12582912 Dec 17 11:45 ibdata1 -rw-r-----. 1 mysql mysql 50331648 Dec 17 11:45 ib_logfile0 -rw-r-----. 1 mysql mysql 50331648 Dec 17 11:45 ib_logfile1 -rw-r-----. 1 mysql mysql 12582912 Dec 17 11:45 ibtmp1 drwxr-x---. 2 mysql mysql 187 Dec 17 11:45 #innodb_temp drwxr-x---. 2 mysql mysql 143 Dec 17 11:45 mysql -rw-r-----. 1 mysql mysql 25165824 Dec 17 11:45 mysql.ibd srwxrwxrwx. 1 mysql mysql 0 Dec 17 11:45 mysql.sock -rw-------. 1 mysql mysql 5 Dec 17 11:45 mysql.sock.lock drwxr-x---. 2 mysql mysql 8192 Dec 17 11:45 performance_schema -rw-------. 1 mysql mysql 1680 Dec 17 11:45 private_key.pem -rw-r--r--. 1 mysql mysql 452 Dec 17 11:45 public_key.pem -rw-r--r--. 1 mysql mysql 1112 Dec 17 11:45 server-cert.pem -rw-------. 1 mysql mysql 1680 Dec 17 11:45 server-key.pem drwxr-x---. 2 mysql mysql 28 Dec 17 11:45 sys -rw-r-----. 1 mysql mysql 10485760 Dec 17 11:45 undo_001 -rw-r-----. 1 mysql mysql 10485760 Dec 17 11:45 undo_002
可使用操作系统 service命令(例如 stop,start, status和restart)来管理MySQL服务器服务。例如:
[root@centosa ~]# service mysqld stop Redirecting to /bin/systemctl stop mysqld.service #对于CentOS,实际是使用systemctl [root@centosa ~]# service mysqld start Redirecting to /bin/systemctl start mysqld.service
注意:该
mysqld
服务默认情况下会随着操作系统启动而自动启动,并在系统重新启动时启动(对于CentOS,可通过systemctl 命令enable和disable来设置)。
2.6、首次使用MySQL服务
在启动mysql服务时,如果MySQL的data目录为空(例MySQL首次启动时,或者人为删除后),则会进行:
- MySQL服务完成初始化。
- SSL证书、密钥文件、初始的数据库及文件在data目录中生成(目录位置见上表)。
- validate_password 已安装并启用。
'root'@'localhost'
创建 一个超级用户帐户。自动生成该用户的密码,并将其存储在错误日志文件中(若没有配置log_error参数,则在初始化时输出到屏幕)。
-------- 至此,RPM安装结束 ----------
3、二进制Generic Binaries方式安装
二进制(Generic Binaries)安装与RPM包两选一即可,不要在同一台机器两种方式都安装,避免冲突。
通用二进制方式安装,相比RPM方式安装具有更大得灵活性,但又不像源代码安装那样复杂费时。二进制安装是将MySQL官方已经编译完成的二进制结果安装在本地操作系统上,安装过程非常简单方便。由于RPM固定了安装后的目录,一般一台机器上只能安装一套MySQL。 二进制安装目录灵活(可以任意路径),一台机器上可以安装多套MySQL软件。
3.1、安装前环境检查
1、确保 MySQL需要依赖libaio软件(net-tools、perl似乎可以不用),确保已将这些软件安装就绪,可以通过rpm -aq 查询操作系统当前已经安装的软件。
2、如果机器上之前通过RPM、Yum或者APT方式安装过MySQL(或者MySQL的变种版本mariadb),则在二进制方式安装前,需要先停止,然后将之前软件彻底删除。 使用root用户,删除软件的命令格式,可参考如下:
# rpm -qa |grep mariadb |xargs rpm -e --nodeps
# rpm -qa |grep mysql |xargs rpm -e --nodeps
还需要将之前数据库的数据目录(可能为/var/lib/mysql)、配置文件(通常为/etc/my.cnf或者/etc/mysql)全部删除。 使用root用户,删除软件的命令格式,可参考如下:
# rm -rf /var/lib/mysql*
# rm -rf /etc/my.cnf*
# rm -rf /etc/mysql
3.2、二进制方式安装(使用root用户)
- 增加操作系统的组和用户:
# groupadd mysql # useradd -r -g mysql -s /bin/false mysql 若需要,可把mysql用户纳入sudo组中。其中wheel为sudo组名(可通过visudo命令查看确认) # usermod -aG wheel mysql
- 根据自己Linux上的glibc版本选择对应的Generic压缩文件下载,解压二进制包,假设安装的目标路径为:/usr/local (解压后,修改目录名或者创建软连接,这样对mysql目录的操作会更加方便)
# cd /usr/local # tar xvf mysql-8.0.18-linux-glibc2.12-x86_64.tar.xz (应先通过" rpm -aq |grep glibc "命令查看本机的glibc的版本,再从MySQL官网下载对应的版本) (另:“minimal install” 官网说明文档为The minimal install distribution excludes debug binaries and is stripped of debug symbols, making it significantly smaller than the regular binary distribution.) # mv mysql-8.0.18-linux-glibc2.12-x86_64 mysql 或者 # ln -s mysql-8.0.18-linux-glibc2.12-x86_64 mysql
- (可选步骤,可跳过)。安装目标路径为:/usr/local/mysql,我们再此目录下分别创建目录mysql-files。 然后在/etc/my.cnf文件中,增加配置“secure_file_priv”指向新建的本目录。该参数的作用为限制import和export的路径(仅允许通过该路径导入导出数据,是一个安全方面的选项)。 生产环境应配置,测试环境本步骤可忽略。 secure_file_priv:等于空表示不做任何限制;等于NULL表示不允许导入;等于目录标准仅允许指定的目录。
# cd /usr/local/mysql # mkdir mysql-files # chown mysql:mysql mysql-files # chmod 750 mysql-files
- 新创建MySQL配置文件/etc/my.cnf,文件的内容如下(根据实际情况修改)
[mysqld] # # Remove leading # and set to the amount of RAM for the most important data # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%. # innodb_buffer_pool_size = 128M # # Remove the leading "# " to disable binary logging # Binary logging captures changes between backups and is enabled by # default. It's default setting is log_bin=binlog # disable_log_bin # # Remove leading # to set options mainly useful for reporting servers. # The server defaults are faster for transactions and fast SELECTs. # Adjust sizes as needed, experiment to find the optimal values. # join_buffer_size = 128M # sort_buffer_size = 2M # read_rnd_buffer_size = 2M # # Remove leading # to revert to previous value for default_authentication_plugin, # this will increase compatibility with older clients. For background, see: # https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin # default-authentication-plugin=mysql_native_password port=3306 server_id=1 innodb_flush_log_at_trx_commit=1 sync_binlog=1 binlog_cache_size=1M binlog_rows_query_log_events=ON datadir=/usr/local/mysql/data log_error=/usr/local/mysql/data/mysqld.err log_timestamps=system character-set-server=utf8mb4 lower_case_table_names=1 [mysql] default_character_set=utf8mb4 [client] default_character_set=utf8mb4
-
初始化数据库。执行以下命令。其中,--user表示执行过程使用指定的用户运行,而不是root(虽然命令是root发起的)。 该命令会根据my.cnf配置文件,自动在当前目录下创建数据存放目录,初始数据库和系统表,并创建MySQL的用户root@localhost和随机的初始密码(因为my.cnf指定了log_error所以初始化密码输出到文件该文件中,否则直接输出到当前屏幕中)。 以下命令执行完成后,可以看到在当前目录下生产了一个“data”新目录。
# cd /usr/local/mysql # bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data (可选步骤,如果需要自动支持ssl安全连接,则执行以下命令创建默认的SSL和RSA文件) # bin/mysql_ssl_rsa_setup
- 启动MySQL。
# cd /usr/local/mysql # bin/mysqld_safe --user=mysql &
停止的命令如下
# bin/mysqladmin -u root -p shutdown
- (可选步骤)执行以下命令后,纳入操作系统的服务管理。
# cd /usr/local/mysql # cp support-files/mysql.server /etc/init.d/mysql.server
- 查看进程。可以看到有两个进程mysqld_safe和mysqld。mysqld是真正提供MySQL服务的进程,而mysqld_safe类似于watchdog的检测进程,这种方式比较安全,当mysqld进程掉了后,mysqld_safe会及时发现并拉一个新的mysqld进程。
-------- 至此,MySQL安装结束 ----------
为了方便使用mysql客户端命令,建议将/usr/local/mysql/bin加入到需要使用该命令的用户profile的PATH环境变量中。
3.3、二进制安装后子目录结构
目录 | 目录内容 |
---|---|
bin | mysqld服务器,客户端和实用程序 |
docs | 信息格式的MySQL手册 |
man | Unix手册页 |
include | 包含(头)文件 |
lib | lib库 |
share | 错误消息,字典和用于数据库安装的SQL |
support-files | 杂项支持文件 |
还有:通常自行创建的/etc/my.cnf配置文件。
4、首次登陆修改密码
- 获得MySQL初始化时生产的临时密码。 若指定了log_error参数,则在该文件中,若没有指定则在初始化输出在屏幕上。 对于RPM方式安装,请对RHEL,Oracle Linux,CentOS和Fedora系统使用以下命令, SLES系统的log文件路径为/var/log/mysql/mysqld.log:
# grep 'temporary password' /var/log/mysqld.log
如果是二进制Generic Binaries安装,则mysql的日志文件为安装目录下的mysqld.err文件(例如:/usr/local/mysql/data/mysqld.err )
- 通过mysql客户端,用上面的临时密码连接到mysql的server,然后立即通过SQL修改该用户的密码
shell$ mysql -uroot -p (输入随机生成的密码) mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Pwd_1234';
- 初始数据库root用户默认只能从localhost上访问。如果希望从其他机器(客户端)访问mysql数据库,可以在mysql命令行中通过以下SQL,将允许登录的客户端host设置任意(不限制)。
mysql> update mysql.user set host = '%' where user = 'root'; mysql> commit; # 这句可以省略,因为默认自动提交 mysql> flush privileges;
这里是修改已有root用户的host属性。还可以:新建一个root用户并把host设置不同值,以便于权限分别管理设置。
- 然后就可以在其他机器上,使用新密码登录MySQL。然后查看当前默认的字符集:
mysql> show variables like '%character%'; +--------------------------+----------------------------------------------------------------+ | Variable_name | Value | +--------------------------+----------------------------------------------------------------+ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | | character_set_system | utf8 | | character_sets_dir | /usr/local/mysql-8.0.18-linux-glibc2.12-x86_64/share/charsets/ | +--------------------------+----------------------------------------------------------------+ 8 rows in set (0.01 sec)