MySQL体系结构及基础管理(二)

1. MySQL体系结构

1.1 MySQL客户端/服务端工作模式(c/s)

1) 本地socket连接方式:
socket=/tmp/mysql.sock
# 通过本地socket文件的方式,去直接登录到数据库,不依赖于ip地址和端口
mysql -S /tmp/mysql.sock
说明: 只能在本地使用,不依赖于ip和端口
(2) 远程TCP/IP连接方式
mysql -uroot -p123 -h 10.0.0.51 -P 3306

在这里插入图片描述
在这里插入图片描述

1.2 服务器端-实例

实例:mysqld+工作线程+预分配的内存结构
功能:管理数据
公司:boss+员工+办公室

在这里插入图片描述

1.3 mysqld程序结构

在这里插入图片描述

1.4 MySQL逻辑结构

Linux 
目录: 名字  + 属性
文件: 文件名 + 文件属性 + 文件内容

MySQL
库: 库名 + 库属性
表: 表名 + 表属性 + 表内容 + 列

mysql> show databases;
mysql> use mysql
mysql> show tables;
mysql> desc user;

1.5 MySQL物理存储结构

engine(存储引擎): 有了段区页,为了连续的io,io是可以顺序进行读写的
段: 一个表就是一个段,可以由一个或者多个区域构成(分区表除外,把一个大表拆分成多个分区表,这个是建表的时候的操作,建一个分区功能的分区表,可以按时间拆分表,每个分区表是要给段)
区: 一个区(簇),默认1M,连续的64个pages
页: 一个页,默认16KB,连续的4个OS block,最小的IO单元

物理存储结构:
在这里插入图片描述

程序结构和物理结构图:

在这里插入图片描述
在这里插入图片描述

2. MySQL基础管理

2.1 用户管理

2.1.1 用户的作用
Linux用户:
	登录Linux系统
	管理Linux对象:文件

MySQL用户:
	登录MySQL数据库
	管理MySQL对象:表

2.1.2 用户的定义
Linux用户: 用户名
MySQL用户: 用户名@'白名单'

白名单: 
	地址列表,允许表明但的ip登录MySQL,管理MySQL。
dong@'localhost'  : dong用户能够通过本地登录MySQL(socket)
dong@'10.0.0.10'  : dong用户能够通过10.0.0.10远程登录MySQL服务器
dong@'10.0.0.%'   : dong用户能够通过10.0.0.xx/24远程MySQL服务器
dong@'10.0.0.5%'  : ... 50-59...
dong@'10.0.0.0/255.255.254.0'  : dong用户能够通10.0.0.xx/23远程MySQL服务器
dong@'%'  :  只要能ping通的主机都可以连接

不常用
dong@'db01' : 主机名
dong@'db01.oldboy.com' : 域名
2.1.3 用户的管理
查:
mysql> desc mysql.user;   # 可以查看有哪些列
mysql> select user,host,authentication_string from mysql.user; # 查看用户和权限
+---------------+-----------+-------------------------------------------+
| user          | host      | authentication_string                     |
+---------------+-----------+-------------------------------------------+
| root          | localhost |                                           |
| mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys     | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
+---------------+-----------+-------------------------------------------+
注: 第三列是查看有无密码,有内容是代表有密码

增:
mysql> create user oldguo@'localhost';  # 创建空密码用户,默认只有usage权限,只能登录
mysql> select user,host from mysql.user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| mysql.session | localhost |
| mysql.sys     | localhost |
| oldguo        | localhost |
| root          | localhost |
+---------------+-----------+

mysql> create user oldboy@'10.0.0.%' identified by '123'; # 创建有密码的用户
mysql> select user,host from mysql.user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| oldboy        | 10.0.0.%  |
| mysql.session | localhost |
| mysql.sys     | localhost |
| oldguo        | localhost |
| root          | localhost |
+---------------+-----------+

注释:从Linux角度方面看,用户信息是存放在/data/3306/mysql/user.MYD , strings user.MYD进行查看这个文件

改:
mysql> select user,host,authentication_string from mysql.user; # 给有密码和没密码的用户设置密码


删:
mysql> drop user oldguo@'localhost' ;
mysql> drop user oldboy@'10.0.0.%' ;
mysql> select user,host,authentication_string from mysql.user;
+---------------+-----------+-------------------------------------------+
| user          | host      | authentication_string                     |
+---------------+-----------+-------------------------------------------+
| root          | localhost |                                           |
| mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys     | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
+---------------+-----------+-------------------------------------------+

注释: 
	(1) 8.0版本以前,是可以通过grant命令来建立用户+授权,8.0版本只能先创建用户在授权限
	(2) oracle中用户被删除,表也别删除
	(3) MySQL中用户被删除,权限跟着没了,但是表和库依然存在

2.2 权限管理

2.2.1 作用
用户对数据库对象,有哪些管理能力
Linux当中权限是文件的属性
MySQL当中权限是用户的属性
2.2.2 权限的表现形式
具体命令
mysql> show privileges;
+-------------------------+---------------------------------------+-------------------------------------------------------+
| Privilege(权限)        | Context(作用的对象)                   | Comment(描述)                                               |
+-------------------------+---------------------------------------+-------------------------------------------------------+
| Alter                   | Tables                                | To alter the table                                    |
| Alter routine(存储过程) | Functions,Procedures                  | To alter or drop stored functions/procedures          |
| Create                  | Databases,Tables,Indexes              | To create new databases and tables                    |
| Create routine          | Databases                             | To use CREATE FUNCTION/PROCEDURE                      |
| Create temporary tables | Databases                             | To use CREATE TEMPORARY TABLE                         |
| Create view             | Tables                                | To create new views                                   |
| Create user             | Server Admin                          | To create new users                                   |
| Delete                  | Tables                                | To delete existing rows                               |
| Drop                    | Databases,Tables                      | To drop databases, tables, and views                  |
| Event                   | Server Admin                          | To create, alter, drop and execute events             |
| Execute                 | Functions,Procedures                  | To execute stored routines                            |
| File                    | File access on server                 | To read and write files on the server                 |
| Grant option            | Databases,Tables,Functions,Procedures | To give to other users those privileges you possess   |
| Index                   | Tables                                | To create or drop indexes                             |
| Insert                  | Tables                                | To insert data into tables                            |
| Lock tables             | Databases                             | To use LOCK TABLES (together with SELECT privilege)   |
| Process                 | Server Admin                          | To view the plain text of currently executing queries |
| Proxy                   | Server Admin                          | To make proxy user possible                           |
| References              | Databases,Tables                      | To have references on tables                          |
| Reload                  | Server Admin                          | To reload or refresh tables, logs and privileges      |
| Replication client      | Server Admin                          | To ask where the slave or master servers are          |
| Replication slave       | Server Admin                          | To read binary log events from the master             |
| Select                  | Tables                                | To retrieve rows from table                           |
| Show databases          | Server Admin                          | To see all databases with SHOW DATABASES              |
| Show view               | Tables                                | To see views with SHOW CREATE VIEW                    |
| Shutdown                | Server Admin                          | To shut down the server                               |
| Super                   | Server Admin                          | To use KILL thread, SET GLOBAL, CHANGE MASTER, etc.   |
| Trigger                 | Tables                                | To use triggers                                       |
| Create tablespace       | Server Admin                          | To create/alter/drop tablespaces                      |
| Update                  | Tables                                | To update existing rows                               |
| Usage                   | Server Admin                          | No privileges - allow connect only                    |
+-------------------------+---------------------------------------+-------------------------------------------------------+
31 rows in set (0.00 sec)
2.2.3 授权和回收权限操作
1) 语法:
	8.0以前:
	grant 权限 on 对象 to 用户 identified by '密码';
	8.0+ :(只能先创建用户在授权) 
    create user 用户 identified by '密码';
    grant 权限 on 对象 to 用户;
    
    grant 权限1,权限2,权限3,... on 对象 to 用户 identified by '密码' with grant option;
权限:
	ALL				   : 管理员
	权限1,权限2,权限3,...: 普通用户(业务用户,开发用户)
	grant opotion	   : 给别的用户授权

对象范围:  库,*.*       : 数据库中的所有对象  ---->    chmod 755 -R  /    管理员
	oldguo.*  : oldguo库下所有的表 ---->    chmod 755 -R   /oldguo 普通用户(业务用户,开发用户)
	oldguo.t1 : oldguo库下的t1表	 ---->	  chmod 755 -R   /oldguo/t12)授权的例子
     例子1: 创建并授权管理员用户oldguo,能够通过10.0.0.%网段登录并管理数据库
     mysql> grant all on *.* to oldguo@'10.0.0.%' identified by '123456' with grant option;
     查询创建用户
     mysql> select user,host from mysql.user;
     查询用户权限
     mysql> show grants for oldguo@'10.0.0.%';
	+----------------------------------------------------------------------+
	| Grants for oldguo@10.0.0.%                                           |
	+----------------------------------------------------------------------+
	| GRANT ALL PRIVILEGES ON *.* TO 'oldguo'@'10.0.0.%' WITH GRANT OPTION |
	+----------------------------------------------------------------------+user表中也记录了用户有哪些权限
	mysql> select * from mysql.user\G

	例子二2: 创建并授权一个app@'10.0.0.%'业务用户,能够对app库下所有对象进行create,select,update,delete,insert操作
	mysql> grant create,update,select,insert,delete on app.* to app@'10.0.0.%' identified by '123';
	mysql> mysql> show grants for app@'10.0.0.%';
	+-----------------------------------------------------------------------------+
	| Grants for app@10.0.0.%                                                     |
	+-----------------------------------------------------------------------------+
	| GRANT USAGE ON *.* TO 'app'@'10.0.0.%'                                      |
	| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE ON `app`.* TO 'app'@'10.0.0.%' |
	+-----------------------------------------------------------------------------+
    mysql> select * from mysql.db\G    # 在这里面也可以查看
扩展: 
	MySQL授权表: MySQL库下的表,授权不同查看的方式不同
	user		 : *.*  # 存放创建的用户和密码包括全局实例级别管理权限设置
	db			 : app.*  # 存放设置的数据库级别的权限设置
	tables_priv  : app.t1  # 存放表级别的权限设置
	columns_priv : 列		# 存放字段级别的权限设置
	procs_priv	 : 存放存储过程中的权限设置

(3)回收权限
  Linux:
  chomod -R 644  /data  ----> chmod -R 755 /data
  MySQL:
  注意: MySQL中不能通过重复授权,修改权限,只能通过回收权限方式进行修改
  例子:
  mysql> mysql> show grants for app@'10.0.0.%';
  +-----------------------------------------------------------------------------+
  | Grants for app@10.0.0.%                                                     |
  +-----------------------------------------------------------------------------+
  | GRANT USAGE ON *.* TO 'app'@'10.0.0.%'                                      |
  | GRANT SELECT, INSERT, UPDATE, DELETE, CREATE ON `app`.* TO 'app'@'10.0.0.%' |
  +-----------------------------------------------------------------------------+
  
  mysql> revoke create on app.* from 'app'@'10.0.0.%';  # 去掉create权限
  
  mysql> show grants for app@'10.0.0.%';
  +---------------------------------------------------------------------+
  | Grants for app@10.0.0.%                                             |
  +---------------------------------------------------------------------+
  | GRANT USAGE ON *.* TO 'app'@'10.0.0.%'                              |
  | GRANT SELECT, INSERT, UPDATE, DELETE ON `app`.* TO 'app'@'10.0.0.%' |
  +---------------------------------------------------------------------+
  
  mysql> show grants; #查看当前用户的权限
  +---------------------------------------------------------------------+
  | Grants for root@localhost                                           |
  +---------------------------------------------------------------------+
  | GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION
  | # 这个数据库是否可以作为代理使用,一般不会用这个
  | GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION        |
  +---------------------------------------------------------------------+

小提示:
	(1) all的权限不包括with grant option	
2.2.4 root密码忘记解决
--skip-grant-tables: 跳过授权表
--skip-networking: 跳过TCP/IP连接
(1) 关闭数据库
[root@db01 ~]# systemctl stop mysqld

(2) 使用安全模式启动
mysqld_safe --skip-grant-tables --skip-networking &
或者:
service mysqld start --skip-grant-tables --skip-networking

(3) 登录数据库并修改密码
[root@db01 ~]# mysql
 mysql> alter user root@'localhost' identified by '123';
 ERROR 1290 (HY000): The MySQL server is running with the --skip-  grant-tables option so it cannot execute this statement
 mysql> flush privileges; # 因为把授权表给跳过了,所以手工加载授权表到内存中
 mysql> alter user root@'localhost' identified by '123';
 
(4) 重启数据库到正常模式
[root@db01 ~]# service mysqld restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS!

2.3 连接管理

在这里插入图片描述

2.3.1 MySQL自带客户端
(1) mysql
参数列表:
	-u 用户名
	-p 密码
	-S 本地socket文件位置
	-h 数据库IP地址
	-P 数据库端口号
	-e 免交互执行数据库命令
	< 导入sql脚本
Socket:
	前提:数据库中必须实现授权oldboy@'localhost'用户
mysql -uoldboy -p123 -S /tmp/mysql.sock # 完整的登录方式
mysql -uoldboy -p -S /tmp/mysql.sock  ***** 推荐方式
mysql -p123 -S /tmp/mysql.sock # 默认root登录
mysql  # 安装完mysql之后,默认root登录
mysql -uroot -p123 

topic:	
	前提: 必须提前创建好,可以远程连接的用户(例如:oldguo@'10.0.0.%')
mysql -uoldguo -p123 -h 10.0.0.51 -P 3306
mysql -uoldguo -p123 -h 10.0.0.51  # 端口默认是3306
mysql -uoldguo -p -h 10.0.0.51 -P 3306

例子:
1. 授权oldboy管理用户,可以通过本地socket登录
(1)创建oldboy用户
mysql>  grant all on *.* to oldboy@'localhost' identified by '123';2) 测试登录
[root@db01 ~]# mysql -uoldboy -p123 -S /tmp/mysql.sock

2. 授权oldboy管理用户,可以通过远程登录
(1) 创建oldboy用户
mysql> grant all on *.* to oldboy@'10.0.0.%' identified by '123456'2) 登录测试
[root@db01 ~]# mysql -uoldboy -p123456 -h10.0.0.61 -P3306

小提示:
	(1) oldboy@'localhost'和oldboy@'10.0.0.%'属于两个不同的用户,一个用户是由 用户名@'白名单' 组成的。
	区分oldboy@'localhost'和oldboy@'10.0.0.%'那个是本地登录和远程登录
	mysql> show processlist;
+----+--------+-----------------+------+---------+------+----------+------------------+
| Id | User   | Host            | db   | Command | Time | State    | Info             |
+----+--------+-----------------+------+---------+------+----------+------------------+
| 11 | oldboy | localhost       | NULL | Sleep   |   28 |          | NULL             |
| 12 | oldboy | 10.0.0.61:44554 | NULL | Query   |    0 | starting | show processlist |
+----+--------+-----------------+------+---------+------+----------+------------------+


-e的应用
[root@db01 ~]# mysql -uroot -p123456 -e "select @@innodb_flush_log_at_trx_commit;"
 mysql: [Warning] Using a password on the command line interface can be insecure.
 +----------------------------------+
 | @@innodb_flush_log_at_trx_commit |
 +----------------------------------+
 |                                1 |
 +----------------------------------+

-e的应用:
[root@db01 ~]# mysql -uroot -p123456 < /root/world.sql

2.3.2 MySQL远程客户端程序

前提: 必须提前创建好,可以远程连接的用户(例如:oldguo@‘10.0.0.%’)

2.3.3 程序连接

yum install -y php-mysql
pip3 install pymysql

2.4 初始化配置管理

2.4.1 初始化的方式
源码安装 -----> 编译过程中设置初始化参数
配置文件 -----> 数据库启动之前,设定配置文件参数 /etc/my.cnf
启动脚本命令行 -----> mysqld_safe --skip-grant-tables --skip-networking &
说明:
my.cnf -----> port=3306   # 自动读取配置文件的port
mysql_safe --port=3307 &  # 命令行的赋值高于配置文件
2.4.2 配置文件应用
(1) 配置文件读取顺序
[root@db01 ~]# mysqld --help --verbose | grep my.cnf
mysqld服务读取配置的顺序: 后面的配置文件里的值能覆盖前面配置文件里的值,如果同时存在/etc/my.cnf
和~/.my.cnf,那么端口最终的值为3307
/etc/my.cnf ---> /etc/mysql/my.cnf ---> /usr/local/mysql/etc/my.cnf ---> ~/.my.cnf 
port=3306																port=3307

意外情况:
	手动定制配置文件位置点:/opt/my.cnf , /data/3306/my.cnf , /data/3307/my.cnf , /data/3308/my.cnf
mysqld  --defaults-file=/opt/my.cnf &
mysqld  --defaults-file=/opt/my.cnf &

(2) 配置文件书写格式
[root@db01 ~]# cat /etc/my.cnf 
[mysqld]						# 服务器端标签
user=mysql 						# 负责数据库管理用户
basedir=/app/database/mysql     # 软件的安装位置
datadir=/data/3306 				# 数据的存放位置
server_id=6						# 标识节点的唯一编号
port=3306 						# 端口号
socket=/tmp/mysql.sock 			# 套接字文件

[mysql]							# 客户端标签
socket=/tmp/mysql.sock          # 读取socket文件位置点

[标签项]
配置参数=xxx
标签是区分不同程序参数的

[服务器端]: 影响数据库服务端运行
[server]
[mysqld]
[mysqld_safe]

[客户端]: 影响本地客户端连接,不影响远程客户端
[mysql]
[mysqldump]
[client]

配置文件基础模板说明:
[root@db01 ~]# cat /etc/my.cnf 
[mysqld]						# 服务器端标签
user=mysql 						# 负责数据库管理用户
basedir=/app/database/mysql     # 软件的安装位置
datadir=/data/3306 				# 数据的存放位置
server_id=6						# 标识节点的唯一编号
port=3306 						# 端口号
socket=/tmp/mysql.sock 			# 套接字文件

[mysql]							# 客户端标签
socket=/tmp/mysql.sock          # 读取socket文件位置点

2.5 启动和关闭

在这里插入图片描述

2.5.1 启动
systemctl start mysqld --调用--> mysql.server --调用--> mysql_safe --调用--> mysqld

mysqld_safe和mysqld,可以在启动数据库时,加入自己执行的参数,例如:
--skip-grant-tables
--skip-networking
--defaults-file=/opt/my.cnf

2.5.2 关闭
systemctl stop mysqld
service mysqld stop
/etc/init.d/mysqld stop
mysqladmin -uroot -p123 shutdown
mysql -uroot -p123 -e "shutdown"

2.6 MySQL多实例

在一个Linux中启动多个MySQL
应用场景:
	(1) 测试环境会被大量使用。
	(2) 大型公司大型集群
2.6.1 同版本多实例
(1) 规划
	软件         1份
	配置文件     3/data/330{7..9}/my.cnf
	数据目录     3/data/330{7..9}
	初始化数据   3份  
	日志目录     3/binlog/330{7..9}
	socket	    3/tmp/mysql330{7..9}.sock
	端口        3份   port=3307,3308,3309
	service_id  3份	 server_id=7,8,9
	
(2) 配置过程
	1. 创建需要目录
	[root@db01 ~]# mkdir -p /data/330{7..9}/data
	[root@db01 ~]# mkdir -p /binlog/330{7..9}

	2. 创建配置文件
	cat > /data/3307/my.cnf <<EOF
	[mysqld]
	basedir=/app/database/mysql
	datadir=/data/3307/data
	socket=/tmp/mysql3307.sock
	log_error=/data/3307/mysql.log
	port=3307
	server_id=7
	log_bin=/binlog/3307/mysql-bin
	EOF
	
	cat > /data/3308/my.cnf <<EOF
	[mysqld]
	basedir=/app/database/mysql
	datadir=/data/3308/data
	socket=/tmp/mysql3308.sock
	log_error=/data/3308/mysql.log
	port=3308
	server_id=8
	log_bin=/binlog/3308/mysql-bin
	EOF
	
	cat > /data/3309/my.cnf <<EOF
	[mysqld]
	basedir=/app/database/mysql
	datadir=/data/3309/data
	socket=/tmp/mysql3309.sock
	log_error=/data/3309/mysql.log
	port=3309
	server_id=9
	log_bin=/binlog/3309/mysql-bin
	EOF
	
	3. 初始化数据
	[root@m01 ~]# chown -R mysql.mysql /data /binlog
	# 把系统默认路径去找的先进行移走,否则多实例也会读取整个配置文件
	[root@m01 ~]# mv /etc/my.cnf /etc/my.cnf.bak  
	# 初始化
	mysqld --initialize-insecure  --user=mysql --datadir=/data/3307/data --basedir=/app/database/mysql
	mysqld --initialize-insecure  --user=mysql --datadir=/data/3308/data --basedir=/app/database/mysql
	mysqld --initialize-insecure  --user=mysql --datadir=/data/3309/data --basedir=/app/database/mysql

	4. 准备启动脚本
	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

	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=/app/database/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=/app/database/mysql/bin/mysqld --defaults-file=/data/3309/my.cnf
	LimitNOFILE = 5000
	EOF
	
	5. 启动多实例
	[root@db01 ~]# systemctl start mysqld3307
	[root@db01 ~]# systemctl start mysqld3308
	[root@db01 ~]# systemctl start mysqld3309
	# 查看多实例是否启动
	[root@m01 ~]# netstat -tlunp
	Active Internet connections (only servers)
	Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name     
	tcp6       0      0 :::3306                 :::*                    LISTEN      10882/mysqld        
	tcp6       0      0 :::3307                 :::*                    LISTEN      12099/mysqld        
	tcp6       0      0 :::3308                 :::*                    LISTEN      12106/mysqld        
	tcp6       0      0 :::3309                 :::*                    LISTEN      12126/mysqld        

2.6.1 不同版本多实例
0. 软连接不同版本软件,修改环境变量
	[root@m01 database]# ln -s mysql-5.6.46-linux-glibc2.12-x86_64/ mysql56
	[root@m01 database]# ln -s mysql-8.0.20-linux-glibc2.12-x86_64/ mysql80
	[root@m01 database]# mv /etc/my.cnf /etc/my.cnf.bak
	# 配置5.7版本的环境变量,因为5.7版本的mysql客户连接工具可以连接5.6、8.0版本的服务端
	[root@m01 database]# vim /etc/profile
	export PATH=/data/redis/src:$PATH
	export PATH=/app/database/mysql/bin:$PATH
	[root@m01 database]# source /etc/profile

1. 准备不同目录
	[root@m01 database]# mkdir -p /data/331{7..8}/data
	[root@m01 database]# mkdir -p /binlog/331{7..8}
	[root@m01 database]# chown -R mysql.mysql /data/* /binlog/*   # 非常重要
2. 准备配置文件
	cat > /data/3317/my.cnf <<EOF
	[mysqld]
	basedir=/app/database/mysql56
	datadir=/data/3317/data
	socket=/tmp/mysql3317.sock
	log_error=/data/3317/mysql.log
	port=3317
	server_id=17
	log_bin=/binlog/3317/mysql-bin
	EOF

	cat > /data/3318/my.cnf <<EOF
	[mysqld]
	basedir=/app/database/mysql80
	datadir=/data/3318/data
	socket=/tmp/mysql3318.sock
	log_error=/data/3318/mysql.log
	port=3318
	server_id=18
	log_bin=/binlog/3318/mysql-bin
	EOF

3. 初始化数据
# 5.6
[root@db01 database]# /app/database/mysql56/scripts/mysql_install_db --user=mysql --datadir=/data/3317/data  --basedir=/app/database/mysql56

# 8.0
[root@db01 database]# /app/database/mysql80/bin/mysqld --initialize-insecure --user=mysql --datadir=/data/3318/data --basedir=/app/database/mysql80

4. 准备启动脚本
# 5.6
cat >/etc/systemd/system/mysqld3317.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/mysql56/bin/mysqld --defaults-file=/data/3317/my.cnf
LimitNOFILE = 5000
EOF
	
cat >/etc/systemd/system/mysqld3318.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/mysql80/bin/mysqld --defaults-file=/data/3318/my.cnf
LimitNOFILE = 5000
EOF

5. 启动多实例
[root@m01 ~]# systemctl start mysqld3317
[root@m01 ~]# systemctl start mysqld3318
或者这样启动
[root@db01 data]# /app/database/mysql56/bin/mysqld  --defaults-file=/data/3317/my.cnf &
[root@db01 data]# /app/database/mysql80/bin/mysqld  --defaults-file=/data/3318/my.cnf &
# 查看启动的端口
[root@m01 ~]# netstat -tlunp

6. 测试登录
 # mysql客户端都是使用的5.7版本,都可以去连接5.6、5.8的mysql服务端
[root@m01 ~]# mysql -uroot -p -S /tmp/mysql3317.sock
 Server version: 5.6.46-log MySQL Community Server (GPL)
[root@m01 ~]# mysql -uroot -p -S /tmp/mysql3318.sock
 Server version: 8.0.20 MySQL Community Server - GPL
 # 这个也可以查看mysql server版本
 mysql> select version();

2.7 MySQL版本升级

4. 升级(小项目)
升级测试: 公司要求在一周内测试升级数据库版本。
	5.6--> 5.7 
	5.7--> 8.0

4.0 升级前准备知识

4.0.1 升级方式
a. inplace (就地升级)

适合于有主从环境.

b. merging (逻辑备份迁移升级)

4.0.2 升级注意事项(INPLACE)

来自于MySQL官网
Upgrade is only supported between General Availability (GA) releases.
Upgrade from MySQL 5.6 to 5.7 is supported. Upgrading to the latest release is recommended before upgrading to the next version. For example, upgrade to the latest MySQL 5.6 release before upgrading to MySQL 5.7.
Upgrade that skips versions is not supported. For example, upgrading directly from MySQL 5.5 to 5.7 is not supported.
Upgrade within a release series is supported. For example, upgrading from MySQL 5.7.x to 5.7.y is supported. Skipping a release is also supported. For example, upgrading from MySQL 5.7.x to 5.7.z is supported.

https://dev.mysql.com/doc/refman/8.0/en/upgrade-paths.html

翻译:
a. 支持GA版本之间升级
b. 5.6--> 5.7  ,先将5.6升级至最新版,再升级到5.7
c. 5.5 ---> 5.7 ,先将5.5 升级至最新,再5.5---> 5.6最新,再5.6--->5.7 最新
d. 回退方案要提前考虑好,最好升级前要备份(特别是往8.0版本升级)。
e. 降低停机时间(停业务的时间)


4.0.3 INPLACE 升级过程原理  
0. 备份原数据库数据
a. 安装新版本软件
b. 关闭原数据库(挂维护页,发短信通知用户)
c. 使用新版本软件 “挂” 旧版本数据启动(--skip-grant-tables ,--skip-networking)
d. 升级 : 只是升级系统表。升级时间和数据量无关的。
e. 正常重启数据库。
f. 验证各项功能是否正常。
g. 业务恢复。


3.1 测试5.6.46 升级到5.7.30

0. 安装高版本软件。
略。

a. 优雅(干净)的关闭5.6 

mysql> set global innodb_fast_shutdown=0;
[root@db01 data]# /usr/local/mysql56/bin/mysqladmin -S /tmp/mysql3317.sock  shutdown

b. 高版本挂低版本数据启动
[root@db01 data]# vim /data/3317/my.cnf 
[mysqld]
user=mysql
basedir=/usr/local/mysql57
datadir=/data/3317/data
socket=/tmp/mysql3317.sock
port=3317
[mysql]
socket=/tmp/mysql3317.sock

[root@db01 ~]# /usr/local/mysql57/bin/mysqld --defaults-file=/data/3317/my.cnf --skip-grant-tables --skip-networking &

c. 升级

[root@db01 ~]# /usr/local/mysql57/bin/mysql_upgrade -S /tmp/mysql3317.sock --force
Checking server version.
Running queries to upgrade MySQL server.
Checking system database.
mysql.columns_priv                                 OK
mysql.db                                           OK
mysql.engine_cost                                  OK
mysql.event                                        OK
mysql.func                                         OK
mysql.general_log                                  OK
mysql.gtid_executed                                OK
mysql.help_category                                OK
mysql.help_keyword                                 OK
mysql.help_relation                                OK
mysql.help_topic                                   OK
mysql.innodb_index_stats                           OK
mysql.innodb_table_stats                           OK
mysql.ndb_binlog_index                             OK
mysql.plugin                                       OK
mysql.proc                                         OK
mysql.procs_priv                                   OK
mysql.proxies_priv                                 OK
mysql.server_cost                                  OK
mysql.servers                                      OK
mysql.slave_master_info                            OK
mysql.slave_relay_log_info                         OK
mysql.slave_worker_info                            OK
mysql.slow_log                                     OK
mysql.tables_priv                                  OK
mysql.time_zone                                    OK
mysql.time_zone_leap_second                        OK
mysql.time_zone_name                               OK
mysql.time_zone_transition                         OK
mysql.time_zone_transition_type                    OK
mysql.user                                         OK
Upgrading the sys schema.
Checking databases.
sys.sys_config                                     OK
Upgrade process completed successfully.
Checking if update is needed.


c. 正常重启数据库 
[root@db01 data]# /usr/local/mysql57/bin/mysqladmin  -S /tmp/mysql3317.sock shutdown 
[root@db01 data]# /usr/local/mysql57/bin/mysqld  --defaults-file=/data/3317/my.cnf   &



3.1 Mysql 5.7.30 Inplace升级到MySQL 8.0.20

7.5.1 升级之前的预检查
a. 安装mysqlsh 
[root@db01 opt]# tar xf mysql-shell-8.0.20-linux-glibc2.12-x86-64bit.tar.gz 
[root@db01 opt]# ln -s /opt/mysql-shell-8.0.20-linux-glibc2.12-x86-64bit /usr/local/mysqlsh
[root@db01 opt]# cd /usr/local/mysqlsh/
[root@db01 bin]# vim /etc/profile
export PATH=/usr/local/mysqlsh/bin:$PATH
[root@db01 bin]# source /etc/profile
[root@db01 bin]# mysqlsh --version
mysqlsh   Ver 8.0.20 for Linux on x86_64 - for MySQL 8.0.20 (MySQL Community Server (GPL))

b.5730数据库中创建链接用户

[root@db01 bin]# mysql -S /tmp/mysql3318.sock 
mysql> create user root@'10.0.0.%' identified with mysql_native_password by '123';
mysql> grant all on *.* to root@'10.0.0.%';


c. 升级前检测
[root@db01 ~]# mysqlsh root:123@10.0.0.51:3318 -e "util.checkForServerUpgrade()" >>/tmp/up.log



7.5.2 正式升级 

a. 安装 新版本软件 8.0.20
ok。

b. 停原库 

# 1. 快速关库功能关闭(优雅关闭)  

连接到数据库中(5.7.30),执行以下语句。
[root@db01 mysql]# mysql -S /tmp/mysql3318.sock

mysql> set global innodb_fast_shutdown=0 ;
mysql> select @@innodb_fast_shutdown;
mysql> shutdown ;


c. 使用高版本软件(8.0.20)挂低版本(5.7.30)数据启动
[root@db01 opt]# vim /data/3318/my.cnf 
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3318/data
socket=/tmp/mysql3318.sock
port=3318
default_authentication_plugin=mysql_native_password
  
[root@db01 data]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3318/my.cnf --skip-grant-tables --skip-networking &

说明: 
	8.0以后的升级不再需要upgrade.启动的时候自动升级。


d. 重启数据库到正常状态  
[root@db01 data]# mysqladmin -S /tmp/mysql3318.sock shutdown
[root@db01 data]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3318/my.cnf &

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值