MySQL 基础管理

用户管理

作用

Linux :
登录系统
管理操作系统对象(文件)

MySQL :
登录数据库
管理数据库对象(表)

用户的定义方式(长成啥样子?)

Linux :
用户名: 字母、数字、特殊符号等组合
MySQL :
用户名@‘白名单’

白名单?
一个或者多个IP的列表。作用是,在列表中存在的IP才能连接数据库。
oldguo@‘localhost’
oldguo@‘10.0.0.52’
oldguo@‘10.0.0.%’
oldguo@‘10.0.0.5%’
oldguo@‘10.0.0.0/255.255.254.0’
oldguo@’%’

用户的管理

查询:

mysql> select user,host from mysql.user;
±--------------±----------+
| user | host |
±--------------±----------+
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
±--------------±----------+

mysql> select user,host,authentication_string ,plugin from mysql.user;
±--------------±----------±------------------------------------------±----------------------+
| user | host | authentication_string | plugin |
±--------------±----------±------------------------------------------±----------------------+
| root | localhost | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 | mysql_native_password |
| mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password |
| mysql.sys | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password |
±--------------±----------±------------------------------------------±----------------------+
3 rows in set (0.00 sec)

#如果记不住以上单词,可以执行以下命令获得
mysql> desc mysql.user;

创建:

需求: 通过 oldguo 用户,密码123 ,从10网段任意地址登陆MySQL
mysql> create user oldguo@‘10.0.0.%’ identified by ‘123’;
mysql> select user,host,authentication_string ,plugin from mysql.user;
±--------------±----------±------------------------------------------±----------------------+
| user | host | authentication_string | plugin |
±--------------±----------±------------------------------------------±----------------------+
| root | localhost | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 | mysql_native_password |
| mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password |
| mysql.sys | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password |
| oldguo | 10.0.0.% | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 | mysql_native_password |
±--------------±----------±------------------------------------------±----------------------+

修改用户

mysql> alter user oldguo@‘10.0.0.%’ identified by ‘123456’;
Query OK, 0 rows affected (0.00 sec)

mysql> select user,host,authentication_string ,plugin from mysql.user;
±--------------±----------±------------------------------------------±----------------------+
| user | host | authentication_string | plugin |
±--------------±----------±------------------------------------------±----------------------+
| root | localhost | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 | mysql_native_password |
| mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password |
| mysql.sys | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password |
| oldguo | 10.0.0.% | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | mysql_native_password |
±--------------±----------±------------------------------------------±----------------------+
4 rows in set (0.00 sec)

删除用户

mysql> drop user oldguo@‘10.0.0.%’;
Query OK, 0 rows affected (0.00 sec)

mysql> select user,host,authentication_string ,plugin from mysql.user;
±--------------±----------±------------------------------------------±----------------------+
| user | host | authentication_string | plugin |
±--------------±----------±------------------------------------------±----------------------+
| root | localhost | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 | mysql_native_password |
| mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password |
| mysql.sys | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password |
±--------------±----------±------------------------------------------±----------------------+
3 rows in set (0.00 sec)

权限管理

作用

控制用户,能够对数据库对象,做哪些操作.

定义方式

Linux 权限: r w x
MySQL 权限: 命令即权限。
mysql> show privileges; —》 查看MySQL中的权限列表
Alter
Alter routine
Create
Create routine
Create temporary tables
Create view
Create user
Delete
Drop
Event
Execute
File
Grant option
Index
Insert
Lock tables
Process
Proxy
References
Reload
Replication client
Replication slave
Select
Show databases
Show view
Shutdown
Super
Trigger
Create tablespace
Update
Usage

说明:
特殊的权限ALL:代表了以上所有权限结合,除了Grant option(给别人授权的功能)。
一般管理员用户会具备ALL,其他普通用户按需提供相应权限,一般DROP种类的权限不会给普通用户。

权限的管理

权限查询

MySQL中权限是属于用户的属性。
mysql> show grants for root@‘localhost’;
GRANT ALL PRIVILEGES ON . TO ‘root’@‘localhost’ WITH GRANT OPTION

授权

GRANT 权限 ON 作用范围 TO 用户 IDENTIFIED BY ‘密码’;

作用范围 ?
. : 全局范围 chmod -R /
wordpress.* : 单库范围 chmod -R /wordpress
wordpress.t1:单表范围 chmod -R /wordpress/a.txt

管理员用户授权:
mysql> grant all on . to oldboy@‘10.0.0.%’ identified by ‘123’;
普通用户授权:
mysql> grant select,update,delete,insert on test.* to test@‘10.0.0.%’ idenfied by ‘123’;

#注意: 不能通过重复授权修改权限,因为授权都是相加的关系。
mysql> revoke delete on test.* from ‘test’@‘10.0.0.%’;

===================================
课间休息: 17:16 ~ 17:30

===================================

8.0 版本之后在 用户、权限管理方面的变化

<1. 必须先建好用户,再授权,grant 命令不再支持自动建用户,不支持设置密码。
<2. 建用户,密码加密插件发生变化,改为 :caching_sha2_password,有很多场景,修改修改为: mysql_native_password
比如: 第三方工具、主从、高可用、备份软件等。。。
mysql> alter user oldboy@‘10.0.0.%’ identified with mysql_native_password by ‘123’;
❤️. 8.0 加入了role(角色)的概念。就是权限的组合。

MySQL 连接管理

自带客户端命令

mysql 命令的使用

-u 用户名
-p 密码
-S Socket文件
-h IP地址
-P 端口号
-e 免交互执行命令
< 导入SQL脚本

IP地址连接串 (tcpip连接方法)

IP Port user passwd
mysql -u用户 -p密码 -h地址 -P端口
前提:
1. IP和端口正确的。
2. 提前创建好可以远程登录的用户

[root@db01 data]# mysql -uoldboy -p123 -h10.0.0.51 -P3306
[root@db01 data]# mysql -uoldboy -p123 -h10.0.0.51

本地Socket文件

前提:
1、 设置正确的Socket文件位置
2、 提前创建好localhost相关用户
3、 只提供给数据库本地连接的特殊方法

[root@db01 data]# mysql -uroot -p -S /tmp/mysql.sock

数据库开发工具连接

sqlyog
navicat
workbench

初始化配置文件

作用

<1. 影响到数据库的启动、日常工作。
<2. 影响到客户端连接(本地服务器上发起的)。

文件格式

[root@db01 ~]# cat /etc/my.cnf
[mysqld]
user=mysql
basedir=/data/app/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
[mysql]
socket=/tmp/mysql.sock

[标签项] : 用来表示不同的程序
服务端: [mysqld] [mysqld_safe] [server]
客户端: [mysql] [mysqldump] [client]
配置=xxx : 设置的参数键值对
user=mysql # 数据库管理用户
basedir=/data/app/mysql # 程序路径
datadir=/data/3306/data # 数据路径
socket=/tmp/mysql.sock # socket文件位置

配置文件读取顺序

#默认配置文件读取顺序
[root@db01 ~]# mysqld --help --verbose |grep my.cnf
/etc/my.cnf —》 /etc/mysql/my.cnf —》 /usr/local/mysql/etc/my.cnf ----》 ~/.my.cnf
建议: 每个数据库保留一个配置文件。
彩蛋:
如果有多个配置文件,例如
/etc/my.cnf —> port=3306
~/.my.cnf —> port=3308
数据库启动时,port是多少?

#手工定义配置文件读取路径
mysqld --defaults-file=/opt/my1.cnf &
mysqld_safe --defaults-file=/opt/my2.cnf &

root本地管理员的密码忘记?

<1. 停数据库
[root@db01 tmp]# /etc/init.d/mysqld stop
Shutting down MySQL… SUCCESS!
[root@db01 tmp]#

<2. 启动数据库到“安全”模式

mysqld_safe --skip-grant-tables --skip-networking &

参数作用:
–skip-grant-tables : 跳过授权表,不开启验证功能。
–skip-networking : 阻止所有TCP/IP网络连接。

❤️. 改密码
mysql> flush privileges;
mysql> alter user root@‘localhost’ identified by ‘123456’;

<4. 重启至正常模式
[root@db01 tmp]# /etc/init.d/mysqld restart

多实例应用

  1. 创建相关目录
    [root@db01 ~]# mkdir -p /data/330{7…9}/data /data/330{7…9}/logs

  2. 准备配置文件
    cat >/data/3307/my.cnf <<EOF
    [mysqld]
    user=mysql
    basedir=/data/app/mysql
    datadir=/data/3307/data
    server_id=7
    port=3307
    log_bin=/data/3307/logs/mysql-bin
    socket=/tmp/mysql3307.sock
    EOF

cat >/data/3308/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/data/app/mysql
datadir=/data/3308/data
server_id=8
port=3308
log_bin=/data/3308/logs/mysql-bin
socket=/tmp/mysql3308.sock
EOF

cat >/data/3309/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/data/app/mysql
datadir=/data/3309/data
server_id=9
port=3309
log_bin=/data/3309/logs/mysql-bin
socket=/tmp/mysql3309.sock
EOF

  1. 授权
    [root@db01 ~]# chown -R mysql. /data/*

  2. 初始化数据
    mv /etc/my.cnf /etc/my.cnf.bak

mysqld --initialize-insecure --user=mysql --basedir=/data/app/mysql --datadir=/data/3307/data
mysqld --initialize-insecure --user=mysql --basedir=/data/app/mysql --datadir=/data/3308/data
mysqld --initialize-insecure --user=mysql --basedir=/data/app/mysql --datadir=/data/3309/data

mv /etc/my.cnf.bak /etc/my.cnf
5. 启动多实例
[root@db01 ~]# mysqld_safe --defaults-file=/data/3307/my.cnf &
[root@db01 ~]# mysqld_safe --defaults-file=/data/3308/my.cnf &
[root@db01 ~]# mysqld_safe --defaults-file=/data/3309/my.cnf &

  1. 使用navicat连接多实例
    mysql -S /tmp/mysql3307.sock
    grant all on . to root@‘10.0.0.%’ identified by ‘123’;
    mysql -S /tmp/mysql3308.sock -e “grant all on . to root@‘10.0.0.%’ identified by ‘123’;”
    mysql -S /tmp/mysql3309.sock -e “grant all on . to root@‘10.0.0.%’ identified by ‘123’;”

  2. 配置多实例systemd
    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=/data/app/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=/data/app/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=/data/app/mysql/bin/mysqld --defaults-file=/data/3309/my.cnf
LimitNOFILE = 5000
EOF

[root@db01 ~]# pkill mysqld
[root@db01 ~]# systemctl start mysqld3307
[root@db01 ~]# systemctl start mysqld3308
[root@db01 ~]# systemctl start mysqld3309

  1. 彩蛋:多版本多实例应用

  2. 上传软件、解压、软连接
    tar xf mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz
    tar xf mysql-8.0.18-linux-glibc2.12-x86_64.tar.xz

ln -s mysql-8.0.18-linux-glibc2.12-x86_64 mysql80
ln -s mysql-5.6.46-linux-glibc2.12-x86_64 mysql56

  1. 创建相关目录
    mkdir -p /data/331{7…8}/data /data/331{7…8}/logs

  2. 准备配置文件
    cat >/data/3317/my.cnf <<EOF
    [mysqld]
    user=mysql
    basedir=/data/app/mysql56
    datadir=/data/3317/data
    server_id=17
    port=3317
    log_bin=/data/3317/logs/mysql-bin
    socket=/tmp/mysql3317.sock
    EOF

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

  1. 授权
    [root@db01 ~]# chown -R mysql. /data/*

  2. 初始化数据

mv /etc/my.cnf /etc/my.cnf.bak

vim /etc/profile
#注释环境变量:
#export PATH=/data/app/mysql/bin:$PATH

#最好重连一个Xshell窗口
[root@db01 ~]# mysql -V
-bash: mysql: command not found
[root@db01 ~]#

#5.6初始化
/data/app/mysql56/scripts/mysql_install_db --user=mysql --basedir=/data/app/mysql56 --datadir=/data/3317/data
#8.0初始化
/data/app/mysql80/bin/mysqld --initialize-insecure --user=mysql --basedir=/data/app/mysql80 --datadir=/data/3318/data

  1. 配置systemd管理
    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=/data/app/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=/data/app/mysql80/bin/mysqld --defaults-file=/data/3318/my.cnf
LimitNOFILE = 5000
EOF

  1. 连接测试
    [root@db01 app]# /data/app/mysql56/bin/mysql -S /tmp/mysql3317.sock
    [root@db01 app]# /data/app/mysql80/bin/mysql -S /tmp/mysql3318.sock

MySQL 的升级、降级

升级

INPLACE就地

在一台服务器上,原版本升级到新版本。
风险较大。

**** 建议 : 不管哪种方式升级,都应该先做备份。方便失败回退。****

Mergeing(logical)迁移 ----> 建议

备份迁移
主从迁移

升级注意事项

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.

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. 降低停机时间(停业务的时间),在业务不繁忙期间升级,做好足够的预演。

INPLACE 升级过程原理 (生产思路)
  1. 备份原数据库数据
    a. 安装新版本软件
    b. 关闭原数据库业务(挂维护页)
    c. 使用新版本软件 “挂” 旧版本数据启动(–skip-grant-tables ,–skip-networking)
    d. 升级 : 只是升级系统表。升级时间和数据量无关的。
    e. 正常重启数据库。
    f. 验证各项功能是否正常。
    g. 业务恢复。
5.6.46 ----> 5.7.28 Inplace 升级演练
  1. 安装 新版本软件

  2. 停原库 (5.6.46)

  3. 快速关库功能关闭(优雅关闭、干净的关闭)
    vim /data/3317/my.cnf
    ##添加以下配置
    innodb_fast_shutdown=0
    [root@db01 data]# systemctl stop mysqld3317

  4. 使用高版本软件挂低版本数据启动
    [root@db01 data]# vim /data/3317/my.cnf
    [mysqld]
    user=mysql
    basedir=/data/app/mysql
    datadir=/data/3317/data
    socket=/tmp/mysql3317.sock
    port=3317
    server_id=17
    innodb_fast_shutdown=0

[root@db01 data]# /data/app/mysql/bin/mysqld_safe --defaults-file=/data/3317/my.cnf --skip-grant-tables --skip-networking &

  1. 升级 (升级到8.0可以省略)
    [root@db01 data]# /data/app/mysql/bin/mysql_upgrade -S /tmp/mysql3317.sock --force

  2. 重启数据库到正常状态
    [root@db01 data]# /data/app/mysql/bin/mysqladmin -S /tmp/mysql3317.sock shutdown

[root@db01 data]# vim /etc/systemd/system/mysqld3317.service
#修改以下内容
ExecStart=/data/app/mysql/bin/mysqld --defaults-file=/data/3317/my.cnf

  1. 启动数据库
    [root@db01 data]# systemctl start mysqld3317

  2. 连接查看
    [root@db01 data]# /data/app/mysql/bin/mysql -S /tmp/mysql3317.sock

mysql8.0的新特性:

1、 mysql-shell工具,8.0以后,可以调用这个命令,升级之前的预检查。
例子:
[root@db01 ~]# mysqlsh root:123@10.0.0.51:3306 -e “util.checkForServerUpgrade()”
2、升级时不再需要手工 mysql_upgrade
3、限制:升级前必须要备份。否则无法回退。

5.7.28 升级至 8.0.18 版本演练
  1. 下载 8.0.18 版本的 mysql-shell,并安装 。
    https://downloads.mysql.com/archives/
    [root@db01 app]# yum install -y mysql-shell-8.0.18-1.el7.x86_64.rpm

  2. 创建连接用户
    [root@db01 data]# /data/app/mysql/bin/mysql -S /tmp/mysql3317.sock
    mysql> grant all on . to root@‘10.0.0.%’ identified by ‘123’;
    mysql> drop user root@‘127.0.0.1’;
    mysql> drop user root@‘db01’;
    mysql> drop user ‘’@‘db01’;
    mysql> drop user ‘’@‘localhost’;
    mysql> drop user root@’::1’;
    mysql> select user,host from mysql.user;
    ±--------------±----------+
    | user | host |
    ±--------------±----------+
    | root | 10.0.0.% |
    | mysql.session | localhost |
    | mysql.sys | localhost |
    | root | localhost |
    ±--------------±----------+

  3. 预 检查
    [root@db01 data]# mysqlsh root:123@10.0.0.51:3317 -e “util.checkForServerUpgrade()” >/tmp/up.log

  4. 停原库(5.7.28)
    vim /data/3317/my.cnf
    ##添加以下配置
    innodb_fast_shutdown=0
    [root@db01 data]# systemctl stop mysqld3317

  5. 使用高版本软件挂低版本数据启动
    [root@db01 data]# vim /data/3317/my.cnf
    [mysqld]
    user=mysql
    basedir=/data/app/mysql80
    datadir=/data/3317/data
    socket=/tmp/mysql3317.sock
    port=3317
    server_id=17
    innodb_fast_shutdown=0

[root@db01 data]# /data/app/mysql80/bin/mysqld_safe --defaults-file=/data/3317/my.cnf --skip-grant-tables --skip-networking &

  1. 重启数据库到正常状态
    [root@db01 data]# /data/app/mysql80/bin/mysqladmin -S /tmp/mysql3317.sock shutdown

[root@db01 data]# vim /etc/systemd/system/mysqld3317.service
#修改以下内容
ExecStart=/data/app/mysql80/bin/mysqld --defaults-file=/data/3317/my.cnf

  1. 启动数据库
    [root@db01 data]# systemctl start mysqld3317

  2. 连接查看
    [root@db01 data]# /data/app/mysql80/bin/mysql -S /tmp/mysql3317.sock

降级:

5.7.28 —》 5.7.10 inplace downgrade演练

原版本:
软件: 5.7.28 /data/app/mysql + 数据:/data/3306/data
目标版本: 5.7.10 /data/app/mysql5710

  1. 安装 5.7.10 (低) 二进制版本
    [root@db01 app]# ln -s mysql-5.7.10-linux-glibc2.5-x86_64 mysql5710

  2. 针对5728版本(高)进行处理工作
    https://dev.mysql.com/doc/refman/5.7/en/downgrading-to-previous-series.html

[root@db01 app]# cp /etc/my.cnf.bak /etc/my.cnf
[root@db01 app]# /etc/init.d/mysqld restart
[root@db01 app]# /data/app/mysql/bin/mysql -uroot -p123456 -S /tmp/mysql.sock

set sql_mode=‘STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION’ ;
set global sql_mode=‘STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION’ ;
select @@sql_mode;
ALTER TABLE mysql.proc MODIFY definer char(77) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT ‘’;
ALTER TABLE mysql.event MODIFY definer char(77) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT ‘’;
ALTER TABLE mysql.tables_priv MODIFY Grantor char(77) COLLATE utf8_bin NOT NULL DEFAULT ‘’;
ALTER TABLE mysql.procs_priv MODIFY Grantor char(77) COLLATE utf8_bin NOT NULL DEFAULT ‘’;

  1. 优雅的关闭5.7.28(高)。
    [root@db01 app]# /data/app/mysql/bin/mysql -uroot -p123456 -S /tmp/mysql.sock
    set global innodb_fast_shutdown=0 ;

[root@db01 app]# /data/app/mysql/bin/mysqladmin -uroot -p123456 shutdown

  1. 删除ib_logfile*
    [root@db01 mysql5710]# rm -rf /data/3306/data/ib_logfile*

  2. 替换配置文件(替换成低版本)
    [root@db01 mysql5710]# vim /etc/my.cnf
    [mysqld]
    user=mysql
    basedir=/data/app/mysql5710
    #basedir=/data/app/mysql
    datadir=/data/3306/data
    socket=/tmp/mysql.sock
    [mysql]
    socket=/tmp/mysql.sock

  3. 低版本启动高版本数据库
    /data/app/mysql5710/bin/mysqld --skip-grant-tables --skip-networking &

  4. 执行upgrade
    [root@db01 ~]# /data/app/mysql5710/bin/mysql_upgrade -uroot -p123456 --force

  5. 启动到正常模式
    [root@db01 ~]# /etc/init.d/mysqld restart
    Shutting down MySQL… SUCCESS!
    Starting MySQL. SUCCESS!

/data/app/mysql5710/bin/mysql -uroot -p123456 -S /tmp/mysql.sock

5.7.28 —》 5.6.46 logical downgrade演练
  1. 恢复5.7.28 环境
    [root@db01 data]# pkill mysqld
    [root@db01 data]# rm -rf /data/3306/data/*

  2. 恢复配置文件
    [root@db01 data]# vim /etc/my.cnf
    [mysqld]
    user=mysql
    basedir=/data/app/mysql
    datadir=/data/3306/data
    socket=/tmp/mysql.sock
    [mysql]
    socket=/tmp/mysql.sock

  3. 恢复环境变量
    vim /etc/profile
    export PATH=/data/app/mysql/bin:$PATH
    [root@db01 data]# source /etc/profile

[root@db01 data]# mysql -V
mysql Ver 14.14 Distrib 5.7.28, for linux-glibc2.12 (x86_64) using EditLine wrapper

  1. 初始化数据
    mysqld --initialize-insecure --user=mysql --basedir=/data/app/mysql --datadir=/data/3306/data

  2. 启动数据库
    [root@db01 data]# /etc/init.d/mysqld start
    Starting MySQL.Logging to ‘/data/3306/data/db01.err’.
    SUCCESS!

mysql> select version();
±----------+
| version() |
±----------+
| 5.7.28 |
±----------+
1 row in set (0.00 sec)

数据库不同版本间备份
  1. 安装5.6.46二进制版本软件
  2. 处理5.7.28高版本数据

set sql_mode=‘STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION’ ;
set global sql_mode=‘STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION’ ;
select @@sql_mode;
ALTER TABLE mysql.proc MODIFY definer char(77) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT ‘’;
ALTER TABLE mysql.event MODIFY definer char(77) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT ‘’;
ALTER TABLE mysql.tables_priv MODIFY Grantor char(77) COLLATE utf8_bin NOT NULL DEFAULT ‘’;
ALTER TABLE mysql.procs_priv MODIFY Grantor char(77) COLLATE utf8_bin NOT NULL DEFAULT ‘’;
ALTER TABLE mysql.tables_priv MODIFY User char(16) NOT NULL default ‘’;
ALTER TABLE mysql.columns_priv MODIFY User char(16) NOT NULL default ‘’;
ALTER TABLE mysql.user MODIFY User char(16) NOT NULL default ‘’;
ALTER TABLE mysql.db MODIFY User char(16) NOT NULL default ‘’;
ALTER TABLE mysql.procs_priv MODIFY User char(16) binary DEFAULT ‘’ NOT NULL;
ALTER TABLE mysql.user ADD Password char(41) character set latin1
collate latin1_bin NOT NULL default ‘’ AFTER user;
UPDATE mysql.user SET password = authentication_string WHERE
LENGTH(authentication_string) = 41 AND plugin = ‘mysql_native_password’;
UPDATE mysql.user SET authentication_string = ‘’ WHERE
LENGTH(authentication_string) = 41 AND plugin = ‘mysql_native_password’;
ALTER TABLE mysql.help_category ENGINE=‘MyISAM’ STATS_PERSISTENT=DEFAULT;
ALTER TABLE mysql.help_keyword ENGINE=‘MyISAM’ STATS_PERSISTENT=DEFAULT;
ALTER TABLE mysql.help_relation ENGINE=‘MyISAM’ STATS_PERSISTENT=DEFAULT;
ALTER TABLE mysql.help_topic ENGINE=‘MyISAM’ STATS_PERSISTENT=DEFAULT;
ALTER TABLE mysql.time_zone ENGINE=‘MyISAM’ STATS_PERSISTENT=DEFAULT;
ALTER TABLE mysql.time_zone_leap_second ENGINE=‘MyISAM’ STATS_PERSISTENT=DEFAULT;
ALTER TABLE mysql.time_zone_name ENGINE=‘MyISAM’ STATS_PERSISTENT=DEFAULT;
ALTER TABLE mysql.time_zone_transition ENGINE=‘MyISAM’ STATS_PERSISTENT=DEFAULT;
ALTER TABLE mysql.time_zone_transition_type ENGINE=‘MyISAM’ STATS_PERSISTENT=DEFAULT;
ALTER TABLE mysql.plugin ENGINE=‘MyISAM’ STATS_PERSISTENT=DEFAULT;
ALTER TABLE mysql.servers ENGINE=‘MyISAM’ STATS_PERSISTENT=DEFAULT;
ALTER TABLE mysql.user MODIFY plugin CHAR(64) COLLATE utf8_bin
DEFAULT ‘mysql_native_password’;
DROP DATABASE sys;

  1. 逻辑全备5.7.28数据
    [root@db01 ~]# mysqldump -A >/tmp/full.sql

  2. 初始化一套5.6.46的空环境
    [root@db01 ~]# vim /etc/profile
    export PATH=/data/app/mysql56/bin:$PATH

[root@db01 ~]# source /etc/profile
[root@db01 ~]# mysql -V
mysql Ver 14.14 Distrib 5.6.46, for linux-glibc2.12 (x86_64) using EditLine wrapper

[root@db01 ~]# mv /etc/my.cnf /etc/my.cnf.bak
mv: overwrite ‘/etc/my.cnf.bak’? y

[root@db01 data]# rm -rf /data/3317/data/*

[root@db01 data]# /data/app/mysql56/scripts/mysql_install_db --user=mysql --basedir=/data/app/mysql56 --datadir=/data/3317/data
[root@db01 data]# vim /etc/systemd/system/mysqld3317.service
ExecStart=/data/app/mysql56/bin/mysqld --defaults-file=/data/3317/my.cnf

[root@db01 data]# systemctl daemon-reload
[root@db01 data]# systemctl start mysqld3317

  1. 恢复备份数据到5.6.46中
    [root@db01 data]# mysql -S /tmp/mysql3317.sock
    mysql> source /tmp/full.sql

体系结构

  1. C/S结构模型
    Client :
    Server :

  2. 实例
    实例: mysqld守护进程+线程(M,IO,SQL,Purge…)+预分配的内存(独占)
    公司: boss+员工(经理,干活的)+ 办公区

  3. MySQL 核心体系结构(SQL语句的执行过程)
    Server层 (实例层)
    engine层 (存储层)
    和磁盘交互。相当Linux文件系统
    具体见图。
    参考:https://www.jianshu.com/p/e872bc12f583

  4. 对象逻辑结构
    Linux MySQL
    目录 库
    文件 表

库: 库名 、库属性
表: 表名、表属性、列(列名、列属性)、行 -----》 元数据(数据字典)+数据

mysql> show databases;
mysql> use mysql
mysql> show tables;

  1. 对象-物理存储结构-宏观
    cd /data/3306/data

库: 对应着 OS 中的目录
表:
例如:
user 表 MyISAM
user.frm : 存储数据字典信息(列相关信息)
user.MYD : 存储数据行
user.MYI : 存储索引

servers 表 InnoDB
servers.frm : 存储数据字典信息(列相关信息)
servers.ibd : 存储数据行和索引

  1. InnoDB存储引擎-物理存储结构引入-微观结构
    存储引擎:MySQL 内部的“文件系统”,和磁盘交互的结构。

segment(数据段) : 表的数据存放的位置,包含1-N个extent(区、簇)
extent (区、簇) : 包含了连续的64个pages,默认1M。
page (数据页) : 最小IO单元,默认是16KB 。连续的4个OS block。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值