03@mysql体系结构管理及mysql多实例部署

mysql体系结构管理

一、mysql体系结构

1、客户端与服务器模型

1)mysql是一个典型的C/S服务结构

1.mysql自带的客户端程序(/service/mysql/bin)
	mysql
	mysqladmin
	mysqldump

2.mysqld一个二进制程序,后台的守护进程
	单进程
	多线程

在这里插入图片描述

2)MySQL的两种连接方式

1.TCP/IP的连接方式
2.套接字连接方式,socket连接

#查看连接方式
mysql> status;
--------------
Connection:		Localhost via UNIX socket

3.举例:
	3.1.TCP/IP连接
	mysql -uroot -p -h127.0.0.1
	mysql -uroot -p -h127.0.0.1 -S /tmp/mysql.sock
	
	3.2.socket连接
	mysql -uroot -p -hlocalhost
	mysql -uroot -p123(默认连接方式,socket)
	
4.注意:
	4.1.因为使用TCP/IP连接,需要建立三次握手
	4.2.不一定-h都是tcp,-hlocalhost是socket连接

3)MySQL服务构成

在这里插入图片描述

2、mysql体系基本管理

1)MySQL管理

#启动MySQL
[root@hzl ~]# ps aux |grep mysqld |grep -v grep      #查看进程,mysqld_safe为启动mysql的脚本文件,内部调用mysqld命令
mysql     3329  0.0  0.0 113252  1592 ?        Ss   16:19   0:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
mysql     3488  0.0  2.3 839276 90380 ?        Sl   16:19   0:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
[root@hzl ~]# netstat -an |grep 3306     #查看端口
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN  
[root@egon ~]# ll -d /var/lib/mysql      #权限不对,启动不成功,注意user和group
drwxr-xr-x 5 mysql mysql 4096 Jul 20 16:28 /var/lib/mysql



#小插曲
安装完mysql 之后,登陆以后,不管运行任何命令,总是提示这个
mac mysql error You must reset your password using ALTER USER statement before executing this statement.
#解决方法:
step 1: SET PASSWORD = PASSWORD('your new password');
step 2: ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER;
step 3: flush privileges;

2)密码设置

#初始状态下,管理员root,密码为空,默认只允许从本机登录localhost
[root@hzl ~]# mysql                       #默认密码为空,可直接输入mysql登录
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.46 Source distribution
.......
....
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> 



#设置MySQL密码
[root@hzl ~]# mysqladmin -uroot password "1"            #设置初始密码 
[root@hzl ~]# mysqladmin -uroot -p"1" password "123"    #修改mysql密码,必须输入原密码才能设置新密码


#登录命令格式:
[root@hzl ~]# mysql -h192.168.15.52 -uroot -p123    #远程登录
[root@hzl ~]# mysql -uroot -p123                    #本地登录方式
[root@hzl ~]# mysql                                 #以root用户登录本机,首次登录密码为空,无需输入密码

3)忘记密码(重置密码)

#方式一:(不建议使用,简单粗暴)
[root@hzl ~]# rm -rf /var/lib/mysql/mysql     #删除所有授权信息全部丢失!!!
[root@hzl ~]# systemctl restart mysql         #重新启动
[root@hzl ~]# mysql   




#方式二:(修改配置文件,启动时,跳过授权库)
[root@hzl ~]# vim /etc/my.cnf          #mysql主配置文件
[mysqld]
skip-grant-table                       #添加此参数,表示跳过密码认证
[root@hzl ~]# systemctl restart mysql
[root@hzl ~]# mysql                    #登录时,直接可以登录
MariaDB [(none)]> update mysql.user set password=password("123") where user="root" and host="localhost";      #进入MySQL,使用此命令进行重置密码
mysql> flush privileges;               #刷新权限
mysql> q\                     
[root@hzl ~]# #打开/etc/my.cnf去掉skip-grant-table,然后重启
[root@hzl ~]# systemctl restart mysql
[root@hzl ~]# mysql -u root -p123      #以新密码登录

4)统一字符编码( utf8mb4支持表情字符)

1》#设置数据库字符编码为utf8mb4_general_ci  
   #设置相应表字段字符编码为utf8mb4_general_ci



2》#设置my.cnf增加以下配置信息

[client]
default-character-set = utf8mb4
 
[mysql]
default-character-set = utf8mb4
 
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'



3》#重启MySQL 保存表情数据查看数据库就可以看到数据库中有表情字符的存在
mysql数据库怎么存入emoji表情

二、mysql服务构成

1.实例

1.MySQL的后台进程+线程+预分配的内存结构。
2.MySQL在启动的过程中会启动后台守护进程,并生成工作线程,预分配内存结构供MySQL处理数据使用。

1.什么是实例?
	一个进程 + 多个线程 + 预分配内存空间
2.多实例?
	多个进程 + 多个线程 + 多个预分配的内存空间

2.mysqld服务器程序构成

mysqld是一个守护进程但是本身不能自主启动
[root@db04 ~]# /etc/init.d/mysqld start

1)连接层

1.验证用户的合法性
2.提供两种连接方式(TCP/IP  socket)
3.建立一个与SQL层交互的线程

2)sql层

1.接收连接层传来的SQL语句
2.验证语法
3.验证语义(DML,DDL,DCL,DQL) 检查你输入的SQL语句是 select insert update delete... grant
4.解析器:解析你的SQL语句,生成多种执行计划
5.优化器:接收解析器传来的多种执行计划,选择最优的一种
6.执行器:将优化器选择出的最优的SQL,执行
	6.1 建立一个与存储引擎层 交互的线程
	6.2 将执行语句交给存储引擎层,取数据 接收存储引擎层,结构化成表的数据结果
7.如果你的前端有缓存,写缓存
8.记录日志(binlog)

3)存储引擎层

1.接收到SQL层传来的SQL语句
2.与磁盘交互,取数据,结构化成表的形式,返回给SQL层
3.建立一个与SQL层交互的线程

三、mysql相关命令

1.启动数据库

/etc/init.d/mysqld start ------> mysql.server ------> mysqld_safe ------> mysqld
systemctl start mysql ------> mysqld_safe ------> mysqld
mysqld_safe --defaults-file=/etc/my.cnf ------> mysqld_safe ------> mysqld

2.停止数据库

/etc/init.d/mysqld stop
systemctl stop mysqld
mysqladmin -uroot -p123 shutdown

#不建议使用
kill -9 pid
killall mysqld
pkill mysqld
#出现问题:
1)如果在业务繁忙的情况下,数据库不会释放pid和sock文件
2)号称可以达到和Oracle一样的安全性,但是并不能100%达到
3)在业务繁忙的情况下,丢数据(补救措施,高可用)

3、设置密码

1)mysqladmin -uroot -p123 password '1'

2)update mysql.user set password=password('123') where user='root' and host='localhost';

3)set password=password('1');             #修改当前用户的密码

4)grant all on *.* to 'root'@'localhost' identified by '123';

四、mysql连接管理

1、mysql自带的连接命令 mysql

mysql
#常见的特定于客户机的连接选项:
-u:				指定用户  mysql -uroot
-p:				指定密码  mysql -uroot -p567
-h:				指定主机域  mysql -uroot -p567 -h127.0.0.1
-P:				指定端口	mysql -uroot -p567 -h127.0.0.1 -P3307
-S:				指定socket文件 mysql -uroot -p567 -S /tmp/mysql.sock
-e:				指定SQL语句(库外执行SQL语句) mysql -uroot -p567 -e "show databases;"
#--protocol:      指定连接方式 mysql --protocol=TCP  --protocol=socket

2、第三方的连接工具

1.sqlyog
2.navicat
#注意:数据库是没有外网的,想连接可以使用通道
3.heidisql
4.应用程序连接MySQL
#注意:需要加载对应语言程序的API

五、mysql多实例部署

用户配置多实例主从部署

NGINX多实例就是多个配置文件
mysql多实例:
	1.多个数据目录
	2.多个端口
	3.多个socket文件
	4.多个日志文件

1.创建多个数据目录

[root@db01 ~]# mkdir -p /data/{3307,3308,3309} 

2.准备多个配置文件

[root@db01 data]# vim /data/3307/my.cnf
[mysqld]
basedir=/service/mysql
datadir=/data/3307/data
port=3307
socket=/data/3307/mysql.sock
log-error=/data/3307/data/mysql.err
log-bin=/data/3307/data/mysql-bin
server_id=7

-------------------------------------------
	
[root@db01 data]# vim /data/3308/my.cnf
[mysqld]
basedir=/service/mysql
datadir=/data/3308/data
port=3308
socket=/data/3308/mysql.sock
log-error=/data/3308/data/mysql.err
log-bin=/data/3308/data/mysql-bin
server_id=8

--------------------------------------------

[root@db01 data]# vim /data/3309/my.cnf 
[mysqld]
basedir=/service/mysql
datadir=/data/3309/data
port=3309
socket=/data/3309/mysql.sock
log-error=/data/3309/data/mysql.err
log-bin=/data/3309/data/mysql-bin
server_id=9

3.初始化多套数据目录

############(mysql-5.6)############
[root@db01 scripts]# ./mysql_install_db --defaults-file=/data/3307/my.cnf --user=mysql --basedir=/service/mysql --datadir=/data/3307/data
	
[root@db01 scripts]# ./mysql_install_db --defaults-file=/data/3308/my.cnf --user=mysql --basedir=/service/mysql --datadir=/data/3308/data

[root@db01 scripts]# ./mysql_install_db --defaults-file=/data/3309/my.cnf --user=mysql --basedir=/service/mysql --datadir=/data/3309/data

#使用tree可以查看
[root@db01 scripts]# tree -L 3 /data





############(mysql-5.7)############
[root@db02 bin]#cd /service/mysql/bin
[root@db02 bin]# /service/mysql/bin/mysql_install_db --defaults-file=/data/3307/my.cnf --user=mysql --basedir=/service/mysql --datadir=/data/3307/data
........
...

###同上!!!

4.授权目录

[root@db01 scripts]# chown -R mysql.mysql /data

5.启动数据库

############(mysql-5.6)############
[root@db01 scripts]# mysqld_safe --defaults-file=/data/3307/my.cnf &
[root@db01 scripts]# mysqld_safe --defaults-file=/data/3308/my.cnf &
[root@db01 scripts]# mysqld_safe --defaults-file=/data/3309/my.cnf &


############(mysql-5.7)############
[root@db02 bin]#cd /service/mysql/bin
[root@db02 bin]#/service/mysql/bin/mysqld_safe --defaults-file=/data/3309/my.cnf &
........
...

###同上!!!


6.检查启动

[root@db01 scripts]# netstat -lntup|grep 330
tcp6       0      0 :::3307                 :::*                    LISTEN      25550/mysqld        
tcp6       0      0 :::3308                 :::*                    LISTEN      25722/mysqld        
tcp6       0      0 :::3309                 :::*                    LISTEN      25894/mysqld     

7.使用SystemCtl管理启动

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=/service/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf
LimitNOFILE = 5000
EOF




cat >/etc/systemd/system/mysqld3308.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=/service/mysql/bin/mysqld --defaults-file=/data/3308/my.cnf
LimitNOFILE = 5000
EOF




cat >/etc/systemd/system/mysqld3309.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=/service/mysql/bin/mysqld --defaults-file=/data/3309/my.cnf
LimitNOFILE = 5000
EOF




#使用systemctl启动mysql
systemctl start mysqld3307
systemctl start mysqld3308
systemctl start mysqld3309

8.多实例设置密码

[root@db01 scripts]# mysqladmin -uroot -S /data/3307/mysql.sock password '3307'
[root@db01 scripts]# mysqladmin -uroot -S /data/3308/mysql.sock password '3308'
[root@db01 scripts]# mysqladmin -uroot -S /data/3309/mysql.sock password '3309'

9.多实例验证

[root@db01 scripts]# mysql -uroot -p3307 -S /data/3307/mysql.sock -e "show variables like 'server_id';"
Warning: Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 7     |
+---------------+-------+
	
[root@db01 scripts]# mysql -uroot -p3308 -S /data/3308/mysql.sock -e "show variables like 'server_id';"
Warning: Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 8     |
+---------------+-------+
	
[root@db01 scripts]# mysql -uroot -p3309 -S /data/3309/mysql.sock -e "show variables like 'server_id';"
Warning: Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 9     |
+---------------+-------+

10.连接多实例小技巧

[root@db01 scripts]# vim /usr/bin/mysql3309
mysql -uroot -p3309 -S /data/3309/mysql.sock
[root@db01 scripts]# vim /usr/bin/mysql3308
mysql -uroot -p3308 -S /data/3308/mysql.sock
[root@db01 scripts]# vim /usr/bin/mysql3307
mysql -uroot -p3307 -S /data/3307/mysql.sock
	
[root@db01 scripts]# chmod +x /usr/bin/mysql*

11、基础配置文件(优化字符设)

[root@db01 system]# cat /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

#skip-grant-table #跳过密码使用


# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
default-character-set=utf8mb4
# include all files from the config directory
!includedir /etc/my.cnf.d

#[client]
#default-character-set=utf8mb4



六、mysql多版本多实例部署

1、解压和软连接(5.6与5.7 )


[root@db01 opt]# ln -s /opt/mysql-5.7.30-linux-glibc2.12-x86_64 /usr/local/mysql57
[root@db01 opt]# ln -s /opt/mysql-5.6.46-linux-glibc2.12-x86_64  /usr/local/mysql56

2、创建目录及授权

mkdir -p /data/331{6..7}/data 
chown -R mysql. /data

3、编写配置文件

cat >/data/3316/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql56 
datadir=/data/3316/data
port=3316 
socket=/tmp/mysql3316.sock 
EOF



cat >/data/3317/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql57 
datadir=/data/3317/data
port=3317 
socket=/tmp/mysql3317.sock 
EOF

4、初始化数据

/usr/local/mysql57/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql57 --datadir=/data/3317/data

/usr/local/mysql56/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql56 --datadir=/data/3316/data

5、启动mysql

[root@db01 opt]# /usr/local/mysql56/bin/mysqld_safe --defaults-file=/data/3316/my.cnf &

[root@db01 opt]# /usr/local/mysql57/bin/mysqld_safe --defaults-file=/data/3317/my.cnf &

6、 mysql连接

[root@db01 opt]# mysql -S /tmp/mysql3307.sock
[root@db01 opt]# mysql -S /tmp/mysql3316.sock
[root@db01 opt]# mysql -S /tmp/mysql3317.sock
posted @ 2021-06-30 12:58  ଲ一笑奈&何  阅读(79)  评论(0编辑  收藏  举报