MySQL超详细安装配置卸载教程
版本选择
在企业生产场景下,数据库是重中之重,因此选择MySQL数据库一定要慎重。下面是给出的一些选择建议:
- 选稳定版版本,即选择开源的社区版的稳定版
- 建议选择第二条产品线中的5.5或5.6版本,目前互联网公司主流版本是5.5和5.6
- 选择MySOL数据库至少发布半年以上的稳定版本
- 尽可能选择前后几个月没有大BUG修复的版本,而不是大量修复BUG的集中版本
- 最好选择向后较长时间没有更新发布的版本
- 要考虑开发人员开发程序使用的版本是否兼容你所选的版本
- 首先作为内部开发测试数据库环境,测试运行几个月的时间
- 优先对企业非核心业务采用新的数据库稳定版本
Linux版本
rpm安装
rpm安装(二进制安装)须提前准备好rpm软件包,且无法满足定制化需求、编译参数、修改路径、依赖冲突问题,不建议使用。
下载Linux版MySQL安装包:https://dev.mysql.com/downloads/mysql/
- Product Version: 8.0.32
- Operating System: Red Hat Enterprise Linux / Oracle Linux
- OS Version: Red Hat Enterprise Linux 7 / Oracle Linux 7 (x86, 64-bit)
- RPM Bundle
rpm这种包资源管理器是不会处理依赖关系的,所以安装有先后顺序。
rpm -ivh mysql-community-common-8.0.32-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-plugins-8.0.32-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-8.0.32-1.el7.x86_64.rpm
安装libs可能会报错,执行命令卸载mysql-libs:yum remove mysql-libs
,然后重新安装libs。
rpm -ivh mysql-community-libs-compat-8.0.32-1.el7.x86_64.rpm
rpm -ivh mysql-community-devel-8.0.32-1.el7.x86_64.rpm
安装devel可能会报错,执行命令安装依赖:yum install openssl-devel -y
,然后重新安装devel。
rpm -ivh mysql-community-client-8.0.32-1.el7.x86_64.rpm
rpm -ivh mysql-community-icu-data-files-8.0.32-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-8.0.32-1.el7.x86_64.rpm
安装server可能会报错,执行命令安装依赖:yum install net-tools
,然后重新安装server。
Bundle包中各类RPM文件说明如下:
- common 服务器和客户端通用库文件
- client-plugins 客户端应用程序插件工具
- libs 客户端应用程序共享库
- libs-compat 兼容老版本共享库
- devel 客户端应用程序开发用的头文件和库文件
- client 客户端应用程序和工具
- server 服务端应用程序和工具
启动MySQL服务:
systemctl start mysqld
systemctl stop mysqld
systemctl restart mysqld
systemctl status mysqld
查看自动生成的root用户密码:grep 'temporary password' /var/log/mysqld.log
修改root用户密码:
set global validate_password.policy=0;
set global validate_password.length=4;
alter user 'root'@'localhost' identified by '1234';
设置密码的复杂度为简单类型,密码长度为4。
创建用户:create user 'root'@'%' identified with mysql_native_password by '1234';
给新创建的root分配权限:grant all on *.* to 'root'@'%';
yum安装
yum安装(在线安装)非常简单:yum install mariadb-server mariadb -y
,若安装指定版本,需配置yum下载源。
二进制安装
这种安装方式,解压即用,非常简单,下面部署MySQL多实例就是以这种方式安装MySQL的。
首先,清空历史环境,卸载CentOS 7自带的mariadb:
rpm -qa | grep mariadb
yum remove mariadb-libs -y
接着,创建用户和组:useradd -s /sbin/nologin -M mysql
,创建相关目录:mkdir -p /app/database
,创建数据目录:mkdir -p /data/3306
,创建日志目录:mkdir -p /binlog/3306
。
设置权限:chown -R mysql.mysql /app/ /data/* /binlog/*
。
下载解压:
cd /app/database/
wget https://mirrors.aliyun.com/mysql/MySQL-5.7/mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz
tar -zxvf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz
ln -s mysql-5.7.36-linux-glibc2.12-x86_64 mysql
设置环境变量:vi /etc/profile
,添加一行:export PATH=/app/database/mysql/bin:$PATH
,然后生效配置:source /etc/profile
。
初始化MySQL
先安装依赖:yum install libaio-devel -y
,再初始化MySQL:
mysqld --initialize-insecure --user=mysql --basedir=/app/database/mysql/ --datadir=/data/3306/
初始化方式:
- --initialize:初始化完成后,会有12位临时密码(使用严格模式),且必须在使用MySQL之前重置该密码
- --initialize-insecure:跳过初始化MySQL数据库安全设置步骤
配置文件设置
cat > /etc/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/app/database/mysql/
datadir=/data/3306/
server_id=6
port=3306
socket=/tmp/mysql.sock
[mysql]
socket=/tmp/mysql.sock
EOF
准备启动脚本
拷贝MySQL启动脚本到系统软件管理目录中:cp /app/database/mysql/support-files/mysql.server /etc/init.d/mysqld
将mysqld加入到chkconfig系统表中:chkconfig --add mysqld
,启动MySQL服务:systemctl start mysqld
。
systemctl start mysqld其实调用的是mysql.server,mysql.server -> mysqld_safe -> mysqld。
关闭数据库可以使用:mysqladmin -uroot shutdown
或者:mysql -uroot -e 'shutdown'
。
编译安装
即源码安装,源代码编译三部曲:
- 获取源码包,解压后,源码目录下有一个Makefile文件
- 进入源码目录下,执行make指令,自动读取Makefile
- make编译完成后,执行make install,安装到指定位置
cmake也是一个编译命令,用于一些跨平台的编译设置,比make更高级,使用起来更方便。
环境准备:
- 内存至少4G,CPU至少2核
- 编译安装过程中,不得出现error关键字
编译前依赖安装:yum install ncurses-devel libaio-devel gcc make cmake wget vim -y
创建mysql用户,用于授权目录:useradd -s /sbin/nologin -M mysql
,-s指定用户登入后所使用的Shell,这里指定不允许登录,-M不创建家目录。
获取MySQL源码,搜狐镜像地址:http://mirrors.sohu.com/mysql/,获取mysql-5.6.49.tar.gz文件下载地址。在家目录下创建一个目录:
mkdir -p /home/myhome/tools
cd /home/myhome/tools
wget 下载地址
tar -zxvf mysql-5.6.49.tar.gz
cd mysql-5.6.49
执行cmake,生成Makefile文件,用于编译安装:
cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.6.49 \
-DMYSQL_DATADIR=/application/mysql-5.6.49/data \
-DMYSQL_UNIX_ADDR=/application/mysql-5.6.49/tmp/mysqld.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DEXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITHOUT_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
-DWITH_ZLIB=bundled \
-DWITH_SSL=bundled \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EMBEDDED_SERVER=1 \
-DENABLE_DOWNLOADS=1 \
-DWITH_DEBUG=0
cmake编译参数设置完成后,会自动生成Makefile文件,最后执行:make && make install
创建软链接:ln -s /application/mysql-5.6.49/ /application/mysql
MySQL初始化
/application/mysql/scripts/mysql_install_db --basedir=/application/mysql/ --datadir=/application/mysql/data/ --user=mysql
启动MySQL服务
可以使用MySQL初始化自动生成的管理脚本:
cp /application/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod 700 /etc/init.d/mysqld
准备MySQL配置文件:cp /application/mysql/support-files/my-default.cnf /etc/my.cnf
创建tmp目录:mkdir -p /application/mysql/tmp
变更文件所有权:chown -R mysql.mysql /application/mysql/
启动MySQL:/etc/init.d/mysqld start
启动的MySQL服务器进程默认名称为mysqld,MySQL客户端进程默认名称为mysql。
客户端连接MySQL
修改PATH环境变量:vim /etc/profile
,在最后一行写入:export PATH=/application/mysql/bin:$PATH
,接着用source命令去加载生效:source /etc/profile
。
登录MySQL:mysql -uroot -p
,退出:exit
。-u指定用户名,紧挨着用户名,-p紧挨着密码,一般不会在命令行写入密码,否则容易通过历史记录看到数据库密码,不安全。还有其他参数:
- -S:本地socket文件位置
- -h:数据库IP地址
- -P:数据库端口号
- -e:免交互执行数据库命令
- <:导入sql脚本
安全配置
MySQL默认没有密码,很不安全,使用mysqladmin命令修改数据库信息:mysqladmin -uroot -p password
。
部署MySQL多实例
基于一个MySQL应用,初始化3次,生成3个独立的MySQL数据目录,即为三个MySQL独立实例。
先进行之前编译安装配置的环境清理,清空PATH有关的MySQL,再停止之前启动的MySQL:/etc/init.d/mysqld stop
- 准备MySQL多实例数据目录:
mkdir -p /data/330{7..9}/data
- 准备MySQL多实例日志目录:
mkdir -p /binlog/330{7..9}
- 设置权限:
chown -R mysql.mysql /data/* /binlog/*
- 可选:
mv /etc/my.cnf /etc/my.cnf.bak
分别创建多实例配置文件
cat > /data/3307/my.cnf <<EOF [mysqld] basedir=/app/database/mysql/ datadir=/data/3307/data/ socket=/tmp/mysql3307.sock log_error=/data/3307/mysql.error.log port=3307 server_id=7 log_bin=/binlog/3307/mysql-bin EOF
- 分别初始化数据:
mysqld --initialize-insecure --user=mysql --basedir=/app/database/mysql/ --datadir=/data/3307/data
准备启停脚本
cat > /etc/systemd/system/mysqld3307.service <<EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/app/database/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf
LimitNOFILE = 5000
EOF
启动多实例
启动MySQL服务:systemctl start mysqld3307
登录MySQL
本地可使用Socket套接字文件,通过内存数据共享进行登录:mysql -S /my_mysql/3306/mysql.sock
。
mysql.sock是MySQL主机和客户机在同一host上的时候,使用UNIX Domain Socket做为通讯协议的载体,它比TCP快,在高并发场景下,效率更高。MySQL进程存在,sock文件就存在,pid文件也存在,否则全部消失。
远程登录授权,例如,允许root用户在192.168.1.x网段内,使用密码123456进行远程连接:
grant all privileges on *.* to 'root'@'192.168.1.%' identified by '123456';
安全配置
MySQL默认没有密码,很不安全,使用mysqladmin命令修改密码:mysqladmin -uroot -S /my_mysql/3306/mysql.sock password
使用套接字文件登录:mysql -p -S /my_mysql/3306/mysql.sock
。
Windows版本
安装与配置
最新版MySQL下载地址:https://dev.mysql.com/downloads/mysql/,下载后解压到D:\dev
目录下。
接着,将D:\dev\mysql-8.0.36-winx64\bin目录配置到环境变量Path当中:右键「此电脑」->「属性」->「高级系统设置」->「环境变量」->「系统变量」中的Path ->「编辑」->「新建」,添加MySQL安装路径中bin文件夹所在路径。
- 初始化data目录
以管理员身份打开命令提示符窗口,执行mysqld --initialize --console
进行data目录初始化,此时会在控制台生成一个随机密码,先将该密码保存起来。 - 安装MySQL服务
执行命令mysqld --install
,看MySQL服务名称:右键「此电脑」->「管理」->「服务和应用程序」->「服务」,找MySQL服务。 - 启停MySQL服务
启动MySQL服务命令net start mysql
,停止MySQL服务命令net stop mysql
。 - 登录MySQL
输入mysql -uroot -p
回车,输入刚才的随机密码,然后回车。 - 修改MySQL的root账户密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
,打开新的命令提示符窗口,重新登录MySQL。
MySQL卸载
停止MySQL服务net stop mysql
,删除MySQL服务mysqld --remove mysql
,删除MySQL目录。
登录MySQL
MySQL8开放root账户远程登录权限(危险动作):
- 第一步:本地使用root账户登录MySQL
- 第二步:
use mysql;
- 第三步:
update user set host = '%' where user = 'root';
- 第四步:
flush privileges;
MySQL 5.7字符集设置
在MySQL 8.0版本之前,默认字符集为latin1,utf8字符集指向的是utf8mb3。从MySQL 8.0开始,数据库的默认编码改为utf8mb4 ,从而避免了乱码问题。
修改MySQL数据目录下的my.ini配置文件:
[mysql] #大概在63行左右,在其下添加
...
default-character-set=utf8 #默认字符集
[mysqld] # 大概在76行左右,在其下添加
...
character-set-server=utf8
collation-server=utf8_general_ci
重启服务后,查看编码命令:
show variables like 'character_%';
show variables like 'collation_%';
命名管道和共享内存
命名管道和共享内存是Windows操作系统中的两种进程间通信方式,客户端进程和服务器进程之间可以考虑使用命名管道或共享内存进行通信。
使用命名管道来进行进程间通信:需要在启动服务器程序的命令中加上--enable-named-pipe参数,然后在启动客户端程序的命令中加入--pipe或者--protocol=pipe参数。
使用共享内存来进行进程间通信:需要在启动服务器程序的命令中加上--shared-memory参数,在成功启动服务器后,共享内存便成为本地客户端程序的默认连接方式,不过也可以在启动客户端程序的命令中加入--protocol=memory参数来显式的指定使用共享内存进行通信。
软件卸载
在“控制面板”选择“卸载程序”,并在程序列表中找到MySQL8.0服务器程序,直接双击卸载即可。这种方式删除,数据目录下的数据不会跟着删除。
残余文件清理
- 服务目录:MySQL服务的安装目录
- 数据目录:默认在C:ProgramDataMySQL
如果自己单独指定过数据目录,就找到自己的数据目录进行删除即可。
注意:请在卸载前做好数据备份。
在操作完以后,需要重启计算机,然后进行安装即可。如果仍然安装失败,需要继续操作如下步骤。
清理注册表(选做)
在系统搜索框中输入regedit:
HKEY_LOCAL_MACHINESYSTEMControlSet001ServicesEventlogApplicationMySQL服务 目录删除
HKEY_LOCAL_MACHINESYSTEMControlSet001ServicesMySQL服务 目录删除
HKEY_LOCAL_MACHINESYSTEMControlSet002ServicesEventlogApplicationMySQL服务 目录删除
HKEY_LOCAL_MACHINESYSTEMControlSet002ServicesMySQL服务 目录删除
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesEventlogApplicationMySQL服务 目录
删除
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesMySQL服务删除
注册表中的ControlSet001、ControlSet002不一定是001和002,可能是ControlSet005、006。
删除环境变量配置
找到path环境变量,将其中关于MySQL的环境变量删除,切记不要全部删除。
MySQL图形化管理工具
有些图形界面工具,特别是旧版本的图形界面工具,在连接MySQL8时出现“Authentication plugin 'caching_sha2_password' cannot be loaded”错误。
出现这个原因是MySQL8之前的版本中加密规则是mysql_native_password,而在MySQL8之后,加密规则是caching_sha2_password。
解决问题方法有两种,第一种是升级图形界面工具版本,第二种是把MySQL8用户登录密码加密规则还原成mysql_native_password。
第二种解决方案如下,用命令行登录MySQL数据库之后,执行如下命令修改用户密码加密规则并更新用户密码:
# 使用mysql数据库
USE mysql;
# 修改'root'@'localhost'用户的密码规则和密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'abc123';
# 刷新权限
FLUSH PRIVILEGES;
服务器程序
⽤来启动MySQL服务器程序的可执⾏⽂件有很多,⼤多在MySQL安装⽬录的bin⽬录下。
- mysqld:这个可执⾏⽂件代表MySQL服务器程序,运⾏这个⽂件就可以直接启动⼀个服务器进程
- mysqld_safe:是⼀个启动脚本,它会间接调⽤mysqld,⽽且还顺便启动了另外⼀个监控进程,这个监控进程在服务器进程挂了的时候,可以帮助重启它。另外,使⽤mysqld_safe启动服务器程序时,它会将服务器程序的出错信息和其他诊断信息重定向到某个⽂件中,产⽣出错⽇志,这样可以⽅便我们找出发⽣错误的原因
- mysql.server:也是⼀个启动脚本,它会间接调⽤mysqld_safe,在调⽤mysql.server时在后边指定start参数启动服务器程序,指定stop参数关闭服务器程序