前言
本文章收录在MySQL性能优化+原理+实战专栏,点击此处查看开篇介绍。
本文摘录自 ▪ 小孩子4919《MySQL是怎样运行的:从根儿上理解MySQL》
该篇文章初心是介绍MySQL的安装,但是随着后面不断的学习,遇到的坑越来越多,导致本篇文章不断的更新,敬请谅解!
在深层次的学习MySQL数据库的时候,有兴趣的小伙伴们可以阅读数据库系统概念,可以深层次的了解数据库底层原理。
目录
一、MySQL是怎么运行的
我们知道MySQL数据库是一个
CS架构
,即客户端服务器架构。
以我们平时使⽤的微信为例,它其实是由两部分组成的,⼀部分是客户端程序,⼀部分是服务器程序。客户端可能有很多种形式,⽐如
- ⼿机APP
- 电脑软件
- ⽹⻚版微信
每个客户端都有⼀个唯⼀的⽤户名,就是你的微信号,另⼀⽅⾯,腾讯公司在他们的机房⾥运⾏着⼀个服务器软件,我们平时操作微信其实都是⽤客户端来和这个服务器来打交道。⽐如张三⽤微信给李四发了⼀条消息的过程其实是这样的:
- 消息被客户端包装了⼀下,添加了发送者和接收者信息,然后从张三的微信客户端传送给微信服务器;
- 微信服务器从消息⾥获取到它的发送者和接收者,根据消息的接收者信息把这条消息送达到李四的微信客户端,李四的微信客户端⾥就显示出张三给他发了⼀条消息。
MySQL的使⽤过程跟这个是⼀样的,它的服务器程序直接和我们存储的数据打交道,然后可以有好多客户端程序连接到这个服务器程序,发送
增删改查
的请求,然后服务器就响应这些请求,从⽽操作它维护的数据。和微信⼀样,MySQL的每个客户端都需要提供⽤户名密码才能登录,登录之后才能给服务器发请求来操作某些数据。我们⽇常使⽤MySQL的情景⼀般是这样的:
- 启动MySQL服务器程序
- 启动MySQL客户端程序并连接到服务器程序
- 在客户端程序中输⼊⼀些命令语句作为请求发送到服务器程序,服务器程序收到这些请求后,会根据请求的内容来操作具体的数据并向客户端返回操作结果
我们知道在⼀台计算机上可以同时运⾏多个程序,每⼀个运⾏着的程序也被称为⼀个进程。我们的MySQL服务器程序和客户端程序本质上都算是计算机上的⼀个进程,这个代表着MySQL服务器程序的进程也被称为MySQL数据库实例,简称数据库实例。
每个进程都有⼀个唯⼀的编号,称为进程ID,英⽂名叫PID,这个编号是在我们启动程序的时候由操作系统随机分配的,操作系统会保证在某⼀时刻同⼀台机器上的进程号不重复。
⽐如你打开了计算机中的QQ程序,那么操作系统会为它分配⼀个唯⼀的进程号,如果你把这个程序关掉了,那操作系统就会把这个进程号回收,之后可能会重新分配给别的进程。当我们下⼀次再启动QQ程序的时候分配的就可能是另⼀个进程号。
每个进程都有⼀个名称,这个名称是编写程序的⼈⾃⼰定义的,⽐如我们启动的MySQL服务器进程的默认名称为
mysqld
, ⽽我们常⽤的MySQL客户端进程的默认名称为
mysql
二、MySQL的安装
安装MySQL的时候是选择开发版本 OR GA版本?
我们需要知道的是开发版本具有最新功能,但生产环境不能使用;GA版本,也称为生产版本或稳定版本。我们一般选择GA版本。
MySQL发行版本名称是怎么来的?
发行版本名称由三个数字和一个可选的后缀组成。例如mysql-community-5.7.6-0.3.m16.el7.src.rpm。版本名称中的数字解释如下:
- 第一个数字(5):是主版本号。
- 第二个数字(7):是次要版本号。总而言之,主要和次要数字构成发行版本号。
- 第三个数字(6):是发行系列中的版本号。对于每个新的错误修正版本,此值均递增。在通常最新版本是最佳选择。
- 里程碑:后缀用于指示版本的稳定性。可能的后缀是:m N(例如, m1, m2, m3,…)表示里程碑编号。rc表示发布候选版(RC)。
通过MySQL的所有内部测试后,没有后缀则表示正式版,是我们生产环境中的主要选择的版本。
2.1 MySQL安装方式
首先,我们需要知道MySQL有以下
- rpm包
- 通用二进制
- 源码编译
三种安装方式。我们通过
源码编译
安装的⽅式还是直接使⽤官⽅
通用二进制
进⾏安装之后,MySQL的服务器程序和客户端程序都会被安装到我们的机器上。不论使⽤上述两者的哪种安装⽅式,一定要记住MySQL的安装⽬录。不过在Linux下使⽤
RPM包
时会有单独的服务器RPM包和客户端RPM包,需要分别安装。
2.2 MySQL下载
- rpm包下载
https://dev.mysql.com/downloads/mysql/mysql官网,点击Archives,选择对应的产品版本、安装方式和操作系统版本,点击Down进行下载
- 通用二进制下载
https://dev.mysql.com/downloads/mysql/mysql官网,点击Archives,选择对应的产品版本、安装方式和操作系统版本,点击Down进行下载
- 源码编译下载
https://dev.mysql.com/downloads/mysql/mysql官网,点击Archives,选择对应的产品版本、安装方式和操作系统版本,点击Down进行下载
2.3 前期准备工作
操作系统配置
[root@loclhost ~]# hostnamectl
Static hostname: mysql2.x88.com
Icon name: computer-vm
Chassis: vm
Machine ID: 28cae06eae1740acbdfe4f88be6ffeb0
Boot ID: 1f9fe175b6a54d2dab41033927790634
Virtualization: vmware
Operating System: CentOS Linux 7(Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-1160.71.1.el7.x86_64
Architecture: x86-64
修改主机名
[root@loclhost ~]# hostnamectl set-hostname mysql2.x88.com
安装常用的软件
[root@loclhost ~]# yum install lrzsz sysstat elinks wget net-tools bash-completion -y
关闭防火墙
[root@loclhost ~]# systemctl status firewalld[root@loclhost ~]# systemctl stop firewalld [root@loclhost ~]# systemctl disable firewalld[root@loclhost ~]# systemctl status firewalld
关闭SELINUX状态
[root@loclhost ~]# getenforce[root@loclhost ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config #永久关闭SELINUX[root@loclhost ~]# setenforce 0 #临时关闭[root@loclhost ~]# getenforce
重启服务器后,查看SELINUX状态
[root@loclhost ~]# init 6 #重启服务器[root@mysql2 ~]# getenforce
2.4 RPM包安装MySQL
我们在根目录下创建一个 /data/install目录用来保存下载或者上传的mysql数据库的各种安装方式的安装包
[root@mysql2 ~]# mkdir -p /data/install[root@mysql2 ~]# cd /data/install/
在这里使用的lrzsz软件上传rpm安装包,或者大家也可以使用sftp等工具进行上传
如服务器有外网的情况下,我们也可以通过wget进行安装包下载
[root@mysql2 install]# wget -O /data/install/mysql-5.7.39-1.el7.x86_64.rpm-bundle.tar https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.39-1.el7.x86_64.rpm-bundle.tar
[root@mysql2 install]# rz
进行解压安装包
[root@mysql2 install]# tar -xvf mysql-5.7.39-1.el7.x86_64.rpm-bundle.tar
卸载CentOS自带的Mariadb,如果系统没有安装Mariadb,可以忽略此步骤。
[root@mysql2 install]# rpm -qa | grep mariadb
mariadb-libs-5.5.68-1.el7.x86_64
[root@mysql2 install]# rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64
安装MySQL需要的依赖包
[root@mysql2 install]# yum install net-tools prel -y
按照以下顺序进行MySQL的安装
- mysql-community-common-5.7.39-1.el7.x86_64.rpm
- mysql-community-libs-5.7.39-1.el7.x86_64.rpm
- mysql-community-client-5.7.39-1.el7.x86_64.rpm
客户端
- mysql-community-server-5.7.39-1.el7.x86_64.rpm
服务器端
[root@mysql2 install]# rpm -ivh mysql-community-common-5.7.39-1.el7.x86_64.rpm[root@mysql2 install]# rpm -ivh mysql-community-libs-5.7.39-1.el7.x86_64.rpm[root@mysql2 install]# rpm -ivh mysql-community-client-5.7.39-1.el7.x86_64.rpm[root@mysql2 install]# rpm -ivh mysql-community-server-5.7.39-1.el7.x86_64.rpm
数据库安装完成,我们需要掌握以下命令来管理MySQL的启停
• systemctl start mysqld 启动
• systemctl stop mysqld 停止
• systemctl status mysqld 状态查询
• systemctl restart mysqld 重启
• systemctl enable mysqld 开机自动启动
• systemctl disable mysqld 关闭开机自动启动
启动MySQL
[root@mysql2 install]# systemctl status mysqld[root@mysql2 install]# systemctl start mysqld
查询MySQL状态
我们可以通过
systemctl status mysqld
或者
lsof -i:端口号
来查询mysql的状态
[root@mysql2 install]# lsof -i:3306
查询MySQL初始化密码
安装mysql的时候,会把初始密码保存在日志里面,日志的位置在/var/log目录下的mysqld.log文件里面,我们使用如下命令查询初始化密码
[root@mysql2 install]# grep -i 'password' /var/log/mysqld.log
修改MySQL密码
查询到密码后,我们使用mysql -uroot -p命令输入查询到初始化密码登陆数据库
[root@mysql2 install]# mysql -uroot -p
Enter password:
## 忽略部分提示 ##
mysql>
登陆数据库成功后,使用alter命令修改root账户密码
alteruser'root'@'localhost' identified by'123456';
2.5 二进制安装MySQL
创建MySQL用户
MySQL用户建议虚拟用户,只用于MySQL进程运行使用,不允许登录、不创建家目录。
[root@mysql2 install]# useradd -s /sbin/nologin -M mysql
创建MySQL目录
- 系统目录 /opt/mysql/my-xx.xx
- 软连接 ln -s /opt/mysql/my-xx.xx /usr/local/mysql
- 数据目录 /data/mysql/my+port/{data,logs}
- 配置文件/data/mysql/my+port/my+port.cnf
[root@mysql2 install]# mkdir -p /data/mysql/my3306/{data,logs}
更改MySQL目录属主和属组
[root@mysql2 install]# chown -R mysql:mysql /data/mysql/[root@mysql2 install]# chmod -R 750 /data/mysql/
解压上传到服务器的mysql二进制安装包
如服务器有外网的情况下可以使用wget进行下载
[root@mysql2 install]# wget -O /data/install/mysql-5.7.39-linux-glibc2.12-x86_64.tar.gz https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.39-linux-glibc2.12-x86_64.tar.gz
[root@mysql2 install]# rz
解压二进制包
[root@mysql2 install]# tar -xvf mysql-5.7.39-linux-glibc2.12-x86_64.tar.gz
将软件部分移动到指定目录
[root@mysql2 install]# mkdir -p /opt/mysql[root@mysql2 install]# cp -R mysql-5.7.39-linux-glibc2.12-x86_64 /opt/mysql/
创建软连接到
/usr/local/
目录下,也就是我们MySQL的安装目录,一定要记住
[root@mysql2 install]# ln -s /opt/mysql/mysql-5.7.39-linux-glibc2.12-x86_64/ /usr/local/mysql
删除系统自带的mariadb,如果系统没有安装mariadb,可忽略
[root@mysql2 install]# rpm -qa | grep mariadb
mariadb-libs-5.5.68-1.el7.x86_64
[root@mysql2 install]# rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64
配置MySQL配置文件
[root@mysql2 install]# cat <<EOF>> /data/mysql/my3306/my3306.cnf[mysqld]user=mysql
basedir=/usr/local/mysql
datadir=/data/mysql/my3306/data
socket = /data/mysql/my3306/mysql.sock
server_id =1
port =3306log_error=/data/mysql/my3306/logs/error.log
EOF
[root@mysql2 install]# more /data/mysql/my3306/my3306.cnf
安装二进制安装mysql所需要的依赖包
[root@mysql2 install]# yum install libaio-devel numactl -y
将该bin⽬录的路径加⼊到环境变量PATH中
这样现在不论我们所处的⼯作⽬录是啥,我们都可以直接输⼊可执⾏⽂件的名字就可以启动它
[root@mysql2 install]# cat <<EOF>> ~/.bash_profileexportPATH=/usr/local/mysql/bin:$PATH
EOF
[root@mysql2 install]# source ~/.bash_profile
初始化数据库
[root@mysql2 install]# mysqld --defaults-file=/data/mysql/my3306/my3306.cnf --initialize --user=mysql
--defaults-file
如果参数文件没有在默认的位置,需要手工指定my.cnf的位置
--initialize
相对应的参数是—initialize-insecure。 “ 默认安全 ”安装(即包括生成随机初始的 root密码)。在这种情况下,密码被标记为已过期,您将需要选择一个新密码。使用
--initialize-insecure
,不会root生成密码。这是不安全的;可以直接登录进入。
--basedir=/usr/local/mysql
可选参数,如果my.cnf当中没有指定路径,需要手工指定,mysql软件位置。
--datadir=/opt/mysql/mysql/data
可选参数,如果my.cnf当中没有指定路径,需要手工指定,mysql数据目录位置。
--user=mysql
数据初始化后,所属的用户
查看密码
[root@mysql2 install]# grep -i 'password' /data/mysql/my3306/logs/error.log
后台启动mysql
nohup:结果默认会输出到nohup.out
&:后台运行
[root@mysql2 install]#nohup mysqld --defaults-file=/data/mysql/my3306/my3306.cnf &[root@mysql2 install]# lsof -i:3306
重置root密码
除了重置初始root密码的动作以外,其它全部默认即可。初始的root密码在错误日志当中
[root@mysql2 install]# mysql_secure_installation -uroot -p --socket=/data/mysql/my3306/mysql.sock#输入日志里密码
Enter password:
Securing the MySQL server deployment.
The existing password for the user account root has expired. Please set a new password.
#设置新密码
New password:
#确认新密码
Re-enter new password:
#是否设置验证密码插件
VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?
Press y|Y for Yes, any other key for No:
Using existing password for root.
Change the password for root ? ((Press y|Y for Yes, any other key for No):... skipping.
# 是否删除匿名账户
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.
Remove anonymous users? (Press y|Y for Yes, any other key for No):... skipping.
# 是否禁止远程登录root用户
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.
Disallow root login remotely? (Press y|Y for Yes, any other key for No):... skipping.
# 是否删除test 数据库
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.
Remove test database and access to it? (Press y|Y for Yes, any other key for No):... skipping.
# 是否重新加载特权表
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No):... skipping.
All done!
登陆mysql
[root@mysql2 install]# mysql -uroot -p --socket=/data/mysql/my3306/mysql.sock
Enter password:
## 忽略部分提示
mysql>
2.6 源码安装MySQL(了解)
源码安装的方式时间非常久,不推荐使用这种方式,如果是想了解mysql引擎源码,可以使用这种方式进行安装。
安装依赖包
[root@mysql2 install]# yum install gcc gcc-c++ openssl openssl-devel ncurses ncurses-devel bison make cmake -y
上传mysql二进制包
如服务器有外网的情况下可以使用wget进行下载
[root@mysql2 install]# wget -O /data/install/mysql-community-5.7.39-1.el7.src.rpm https://cdn.mysql.com/archives/mysql-5.7/mysql-community-5.7.39-1.el7.src.rpm
[root@mysql2 install]# rz
安装mysql二进制包,生产源码包
[root@mysql2 install]# rpm -ivh mysql-community-5.7.39-1.el7.src.rpm [root@mysql2 install]# ll ~/rpmbuild/SOURCES/
创建用户
[root@mysql2 install]# useradd -s /sbin/nologin -M mysql
删除系统自带的mariadb,没有没有安装,可以忽略
[root@mysql2 install]# rpm -qa | grep mariadb
mariadb-libs-5.5.68-1.el7.x86_64
[root@mysql2 install]# rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64
编译安装
[root@mysql2 install]# cd ~/rpmbuild/SOURCES/[root@mysql2 SOURCES]# tar -xvf mysql-5.7.39.tar.gz[root@mysql2 SOURCES]# cd mysql-5.7.39/[root@mysql2 mysql-5.7.39]# cp ../boost_1_59_0.tar.bz2 ./[root@mysql2 mysql-5.7.39]# tar -xvf boost_1_59_0.tar.bz2 [root@mysql2 mysql-5.7.39]# cmake ./ -DWITH_BOOST=boost_1_59_0/ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DSYSCONFDIR=/etc -DMYSQL_DATADIR=/usr/local/mysql/data -DINSTALL_MANDIR=/usr/share/man -DMYSQL_TCP_PORT=3306 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DDEFAULT_CHARSET=utf8 -DEXTRA_CHARSETS=all -DDEFAULT_COLLATION=utf8_general_ci -DWITH_READLINE=1 -DWITH_SSL=system -DWITH_EMBEDDED_SERVER=1 -DENABLED_LOCAL_INFILE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1
如果缓存失败,清除缓存,重新编译
[root@mysql2 mysql-5.7.39]# make clean[root@mysql2 mysql-5.7.39]# rm CMakeCache.txt
安装
[root@mysql2 mysql-5.7.39]# make && make install
配置mysql配置文件
[root@mysql2 mysql-5.7.39]# cat <<EOF>> /etc/my.cnf[mysqld]user=mysql
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket = /tmp/mysql.sock
server_id =1
port =3306log_error=/usr/local/mysql/data/error.log
EOF
[root@mysql2 mysql-5.7.39]# more /etc/my.cnf
配置环境变量
[root@mysql2 install]# cat <<EOF>> ~/.bash_profileexportPATH=/usr/local/mysql/bin:$PATH
EOF
[root@mysql2 install]# source ~/.bash_profile
初始化数据库
[root@mysql2 mysql-5.7.39]# mysqld --initialize --user=mysql //使用/etc/my.cnf ,则不需要指定参数文件
查看密码
[root@mysql2 mysql-5.7.39]# grep -i 'password' /usr/local/mysql/data/error.log 2023-04-13T02:08:03.308852Z 1[Note] A temporary password is generated for root@localhost: Y;_cFdha-4Lm
启动MySQL
[root@mysql2 mysql-5.7.39]## nohup mysqld & //使用/etc/my.cnf ,则不需要指定参数文件
查看是否启动成功
[root@mysql2 mysql-5.7.39]# lsof -i:3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 89895 mysql 23u IPv6 183192 0t0 TCP *:mysql (LISTEN)
重置初始root密码
[root@mysql2 mysql-5.7.39]# mysql_secure_installation -uroot -p //sock如果在/tmp/mysql.sock 则不需要指定#输入日志里密码
Enter password:
Securing the MySQL server deployment.
The existing password for the user account root has expired. Please set a new password.
#设置新密码
New password:
#确认新密码
Re-enter new password:
#是否设置验证密码插件
VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?
Press y|Y for Yes, any other key for No:
Using existing password for root.
Change the password for root ? ((Press y|Y for Yes, any other key for No):... skipping.
# 是否删除匿名账户
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.
Remove anonymous users? (Press y|Y for Yes, any other key for No):... skipping.
# 是否禁止远程登录root用户
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.
Disallow root login remotely? (Press y|Y for Yes, any other key for No):... skipping.
# 是否删除test 数据库
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.
Remove test database and access to it? (Press y|Y for Yes, any other key for No):... skipping.
# 是否重新加载特权表
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No):... skipping.
All done!
13、连接mysql
[root@mysql2 mysql-5.7.39]# mysql -uroot -p123456
mysql>
三、多实例部署
3.1 多实例概念
如果一个系统有多个数据库端口(例如有3306 ,也有3307 )则这个服务器上是多实例。
MySQL实例构成
由进程+线程+预分配内存组成,mysql是单进程多线程的结构
- 进程:正在运行的程序
- 查看mysql进程:ps -ef |grep mysql
- 杀死mysql进程:kill 进程号、 pkill 进程名称
- 线程:Master thread、purge thread 、page cleaner thread、io thread
- 预分配内存:buffer pool、insert buffer、change buffer、double write
什么是多实例
- 在一台机器上由多个实例(进程+线程+预分配内存)构成
注意事项
- 系统共用,实例之间具有不同的datadir、server_id、port、日志文件、socket文件和配置文件
- innodb_buffer_pool_size分配的总量要小于物理内存的80%
3.2 多实例安装(二进制)
安装需要的依赖包
[root@mysql2 install]# yum install libaio-devel numactl -y
创建用户
[root@mysql2 install]# useradd -s /sbin/nologin -M mysql
创建目录
[root@mysql2 install]# mkdir -p /data/mysql/{my3306,my3307}/{data,logs}
更改用户和组
[root@mysql2 install]# chown -R mysql:mysql /data/mysql/[root@mysql2 install]# chmod -R 750 /data/mysql/
解压包
[root@mysql2 install]# tar -xvf mysql-5.7.39-linux-glibc2.12-x86_64.tar.gz
将软件部分移动到指定目录
[root@mysql2 install]# mkdir -p /opt/mysql[root@mysql2 install]# cp -R mysql-5.7.39-linux-glibc2.12-x86_64 /opt/mysql/
创建软连接
[root@mysql2 install]# ln -s /opt/mysql/mysql-5.7.39-linux-glibc2.12-x86_64/ /usr/local/mysql
删除系统自带的mariadb,如果没有安装mariadb,可忽略
[root@mysql2 install]# rpm -qa | grep mariadb
mariadb-libs-5.5.68-1.el7.x86_64
[root@mysql2 install]# rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64
创建配置文件
实例之间具有不同的datadir、server_id、port、日志文件、socket文件和配置文件
[root@mysql2 install]# cat <<EOF>> /data/mysql/my3306/my3306.cnf[mysqld]user=mysql
basedir=/usr/local/mysql
datadir=/data/mysql/my3306/data
socket = /data/mysql/my3306/mysql.sock
server_id =1
port =3306log_error=/data/mysql/my3306/logs/error.log
EOF
[root@mysql2 install]# cat <<EOF>> /data/mysql/my3307/my3307.cnf[mysqld]user=mysql
basedir=/usr/local/mysql
datadir=/data/mysql/my3307/data
socket = /data/mysql/my3307/mysql.sock
server_id =2
port =3307log_error=/data/mysql/my3307/logs/error.log
EOF
配置环境变量
[root@mysql2 install]# cat <<EOF>> ~/.bash_profileexportPATH=/usr/local/mysql/bin:$PATH
EOF
[root@mysql2 install]# source ~/.bash_profile
初始化数据库
[root@mysql2 install]# mysqld --defaults-file=/data/mysql/my3306/my3306.cnf --initialize --user=mysql[root@mysql2 install]# mysqld --defaults-file=/data/mysql/my3307/my3307.cnf --initialize --user=mysql
查看密码
[root@mysql2 install]# grep -i 'password' /data/mysql/my3306/logs/error.log[root@mysql2 install]# grep -i 'password' /data/mysql/my3307/logs/error.log
启动mysql
[root@mysql2 install]# nohup mysqld --defaults-file=/data/mysql/my3306/my3306.cnf &[root@mysql2 install]# nohup mysqld --defaults-file=/data/mysql/my3307/my3307.cnf &
查看是否启动成功
[root@mysql2 install]# lsof -i:3306[root@mysql2 install]# lsof -i:3307
重置root密码
[root@mysql2 install]# mysql_secure_installation -uroot -p --socket=/data/mysql/my3306/mysql.sock[root@mysql2 install]# mysql_secure_installation -uroot -p --socket=/data/mysql/my3307/mysql.sock
16、连接msyql
[root@mysql2 install]# mysql -uroot -p123456 --socket=/data/mysql/my3306/mysql.sock[root@mysql2 install]# mysql -uroot -p123456 --socket=/data/mysql/my3307/mysql.sock
mysql>select @@server_id;+-------------+| @@server_id|+-------------+|2|+-------------+1rowinset(0.00 sec)
mysql>select @@port;+--------+| @@port|+--------+|3307|+--------+1rowinset(0.00 sec)
3.3 mysqld_multi(多实例第二种安装方式)
安装需要的依赖包
[root@mysql2 install]# yum install libaio-devel numactl -y
创建用户
[root@mysql2 install]# useradd -s /sbin/nologin -M mysql
创建目录
[root@mysql2 install]# mkdir -p /data/mysql/{my3306,my3307}/{data,logs}
更改用户和组
[root@mysql2 install]# touch /data/mysql/{my3306,my3307}/logs/error.log[root@mysql2 install]# chown -R mysql:mysql /data/mysql/[root@mysql2 install]# chmod -R 750 /data/mysql/
解压安装包(二进制包)
[root@mysql2 install]# tar -xvf mysql-5.7.39-linux-glibc2.12-x86_64.tar.gz
将软件部分移动到指定目录
[root@mysql2 install]# mkdir -p /opt/mysql[root@mysql2 install]# cp -R mysql-5.7.39-linux-glibc2.12-x86_64 /opt/mysql/
创建软连接
[root@mysql2 install]# ln -s /opt/mysql/mysql-5.7.39-linux-glibc2.12-x86_64/ /usr/local/mysql
删除系统自带的mariadb,如果没有安装mariadb,可忽略
[root@mysql2 install]# rpm -qa | grep mariadb
mariadb-libs-5.5.68-1.el7.x86_64
[root@mysql2 install]# rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64
配置环境变量
[root@mysql2 install]# cat <<EOF>> ~/.bash_profileexportPATH=/usr/local/mysql/bin:$PATH
EOF
[root@mysql2 install]# source ~/.bash_profile
创建多实例配置文件
[root@mysql2 install]# cat <<EOF>> /etc/my_multi.cnf[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
[mysqld1]user=mysql
basedir=/usr/local/mysql
datadir=/data/mysql/my3306/data
socket = /data/mysql/my3306/mysql.sock
server_id =1
port =3306log_error=/data/mysql/my3306/logs/error.log
[mysqld2]user=mysql
basedir=/usr/local/mysql
datadir=/data/mysql/my3307/data
socket = /data/mysql/my3307/mysql.sock
server_id =2
port =3307log_error=/data/mysql/my3307/logs/error.log
EOF
初始化实例
我们需要知道的mysqld_multi启动的时候会自动初始化数据库
- 初始化所有实例
[root@mysql2 install]# mysqld_multi --defaults-extra-file=/etc/my_multi.cnf start[root@mysql2 install]# lsof -i:3306[root@mysql2 install]# lsof -i:3307
初始化实例完成后,查询数据库没有启动,–log参数查询什么原因,如下
[root@mysql2 install]# mysqld_multi --defaults-extra-file=/etc/my_multi.cnf start 2 --log=/tmp/error.log
- 初始化一个实例
[root@mysql2 install]# mysqld_multi --defaults-extra-file=/etc/my_multi.cnf start 2
重置root密码
[root@mysql2 install]# mysql_secure_installation -uroot -p --socket=/data/mysql/my3306/mysql.sock[root@mysql2 install]# mysql_secure_installation -uroot -p --socket=/data/mysql/my3307/mysql.sock
连接mysql
[root@mysql2 install]# mysql -uroot -p123456 --socket=/data/mysql/my3306/mysql.sock[root@mysql2 install]# mysql -uroot -p123456 --socket=/data/mysql/my3307/mysql.sock
mysql>select @@server_id;
+-------------+
| @@server_id |
+-------------+
|2|
+-------------+
1 row inset(0.00 sec)
mysql>select @@port;
+--------+
| @@port |
+--------+
|3307|
+--------+
1 row inset(0.00 sec)
停止单个实例
[root@mysql2 install]# mysqladmin -uroot -p123456 shutdown --socket=/data/mysql/my3306/mysql.sock[root@mysql2 install]# mysqld_multi --defaults-extra-file=/etc/my_multi.cnf --password=123456 --user=root stop 2
停止全部实例
[root@mysql2 install]# mysqld_multi --defaults-extra-file=/etc/my_multi.cnf --password=123456 --user=root stop
查看全部实例状态
[root@mysql2 install]# mysqld_multi --defaults-extra-file=/etc/my_multi.cnf report
查看单个实例状态
[root@mysql2 install]# mysqld_multi --defaults-extra-file=/etc/my_multi.cnf report 3307
3.4 使用service 控制实例的启停
1、修改脚本如下
[root@mysql2 install]# cd /usr/local/mysql/support-files/[root@mysql2 support-files]# more mysqld_multi.server #!/bin/sh## A simple startup script for mysqld_multi by Tim Smith and Jani Tolonen.# This script assumes that my.cnf file exists either in /etc/my.cnf or# /root/.my.cnf and has groups [mysqld_multi] and [mysqldN]. See the# mysqld_multi documentation for detailed instructions.## This script can be used as /etc/init.d/mysql.server## Comments to support chkconfig on RedHat Linux# chkconfig: 2345 64 36# description: A very fast and reliable SQL database engine.## Version 1.0#basedir=/usr/local/mysql
bindir=/usr/local/mysql/bin
iftest -x $bindir/mysqld_multi
thenmysqld_multi="$bindir/mysqld_multi";elseecho"Can't execute $bindir/mysqld_multi from dir $basedir";exit;ficase"$1"in'start')"$mysqld_multi" --defaults-extra-file=/etc/my_multi.cnf start $2;;'stop')"$mysqld_multi" --defaults-extra-file=/etc/my_multi.cnf --password=123456 --user=root stop $2;;'report')"$mysqld_multi" --defaults-extra-file=/etc/my_multi.cnf report $2;;'restart')"$mysqld_multi" --defaults-extra-file=/etc/my_multi.cnf --password=123456 --user=root stop $2"$mysqld_multi" --defaults-extra-file=/etc/my_multi.cnf start $2;;
*)echo"Usage: $0 {start|stop|report|restart}">&2;;esac
测试脚本是否可以使用
[root@mysql2 support-files]# ./mysqld_multi.server report
Reporting MySQL servers
MySQL server from group: mysqld1 is running
MySQL server from group: mysqld2 is not running
[root@mysql2 support-files]# ./mysqld_multi.server start 2[root@mysql2 support-files]# ./mysqld_multi.server report
Reporting MySQL servers
MySQL server from group: mysqld1 is running
MySQL server from group: mysqld2 is running
[root@mysql2 support-files]# ./mysqld_multi.server stop[root@mysql2 support-files]# ./mysqld_multi.server report
Reporting MySQL servers
MySQL server from group: mysqld1 is not running
MySQL server from group: mysqld2 is not running
添加到mysqlds到service
[root@mysql2 support-files]# cp /usr/local/mysql/support-files/mysqld_multi.server /etc/init.d/mysqld_multi[root@mysql2 support-files]# chkconfig /etc/init.d/mysqld_multi on[root@mysql2 support-files]# chkconfig mysqld_multi --list
注:该输出结果只显示 SysV 服务,并不包含
原生 systemd 服务。SysV 配置数据
可能被原生 systemd 配置覆盖。
要列出 systemd 服务,请执行 'systemctl list-unit-files'。
查看在具体 target 启用的服务请执行
'systemctl list-dependencies [target]'。
mysqld_multi 0:关 1:关 2:开 3:开 4:开 5:开 6:关
[root@mysql2 init.d]# service mysqld_multi start
WARNING: my_print_defaults command not found.
Please make sure you have this command available and
in your path. The command is available from the latest
MySQL distribution.
ABORT: Can't find command 'my_print_defaults'.
This command is available from the latest MySQL
distribution. Please make sure you have the commandin your PATH.
解决方法
[root@mysql2 init.d]# cp /usr/local/mysql/bin/my_print_defaults /usr/bin/[root@mysql2 init.d]# service mysqld_multi start[root@mysql2 init.d]# service mysqld_multi report
Reporting MySQL servers
MySQL server from group: mysqld1 is running
MySQL server from group: mysqld2 is running
[root@mysql2 init.d]# service mysqld_multi stop 1[root@mysql2 init.d]# service mysqld_multi start 1
五、数据库远程连接
无非就是创建一个
'root'@'%'
用户,授予所有权限。后面会讲到的,这里就不唠叨了
小提示:
%
代表任何主机,后面会有讲解
很多小伙伴问为什么要创建用户,grant 在MySQL 8版本后无法创建用户
mysql>createuser'root'@'%' identified by'123456';
mysql>grantallprivilegeson*.*to'root'@'%'withgrantoption;
Query OK,0rows affected,1 warning (0.01 sec)
mysql> flush privileges;
Query OK,0rows affected (0.01 sec)
六、数据库卸载
6.1 通用二进制 OR 源码编译安装 OR 多实例卸载MySQL
查找MySQL进程PID
[root@mysql2 install]# lsof -i:MySQL端口
kill进程
[root@mysql2 install]# kill -9 PID号
查找安装MySQL的所有目录,删除即可
[root@mysql2 install]# find / -name mysql[root@mysql2 install]# rm -rf 查询出来的目录
删除用户和组
[root@mysql2 install]# userdel -r mysql[root@mysql2 install]# groupdel -f msyql
6.2 RPM安装卸载
停止MySQL服务
[root@mysql2 ~]# systemctl stop mysqld
卸载MySQL
[root@mysql2 ~]# rpm -qa | grep mysql[root@mysql2 ~]# rpm -e --nodeps 查询出来的rpm包
查找安装MySQL的所有目录,删除即可
[root@mysql2 install]# find / -name mysql[root@mysql2 install]# rm -rf 查询出来的目录
删除用户和组
[root@mysql2 install]# userdel -r mysql[root@mysql2 install]# groupdel -f msyql
总结
- MySQL数据库是一个
CS架构
,即客户端服务器架构 MySQL
的⼤部分安装包都包含了服务器程序和客户端程序,不过在Linux下使⽤RPM包时会有单独的服务器RPM包和客户端RPM包,需要分别安装。- 源码和二进制安装MySQL⼀定⼀定⼀定要记住你把MySQL安装到哪了,换句话说,⼀定要记住MySQL的安装⽬录
- 关于啥是环境变量以及如何在当前系统中添加或修改系统变量不是我们唠叨的范围,⼤家找本相关的书或者上⽹查⼀查哈
- MySQL 8.0 安装方式和MySQL 5.7一样,此处就不在唠叨了,但是注意在配置文件里添加
lower-case-table-names=1
忽略大小写,要不然后期你可能找不到表,也无法修改该变量。
版权归原作者 multis 所有, 如有侵权,请联系我们删除。