zoukankan      html  css  js  c++  java
  • MySQL之2---基础管理

    MySQL之2---基础管理

    一、用户管理

    作用:登录数据库,管理数据库对象

    格式

    mysql用户账号由两部分组成:

    'USERNAME'@'HOST‘
    

    HOST说明:

    • 限制此用户可通过哪些远程主机连接mysql服务器
    • 支持使用通配符:
    % 匹配任意长度的任意字符
    172.16.0.0/255.255.0.0 或 172.16.%.%
    _ 匹配任意单个字符
    
    示例:
    'root'@'localhost‘               本地用户
    'root'@'db02‘                    单一IP用户
    'root'@'10.0.0.2‘                单一IP用户
    'root'@'10.0.0.%‘                范围IP用户
    'root'@'10.0.0.5%‘               范围IP用户
    'root'@'10.0.0.0/255.255.254.0‘  范围IP用户
    'root'@'%‘                       范围IP用户
    

    不指定@'HOST‘默认@'%‘

    • 匹配优先级:

    image-20201102145157246

    安全规范:

    a. 尽量小, 最好细化到单一IP, 不能使用%

    b. 用户名有特点

    c. 无用的用户要删除(5.7以前)或者锁定

    d. 密码超过三种复杂度, 12位以上

    操作命令

    创建用户和密码

    create user 'USERNAME'@'HOST' identified by 'PASSWORD';
    

    8.0新特性:

    1. 8.0 之后语句变化, grant不再支持创建用户和修改密码的功能, 不能

      grant all on *.* to wordpress@'10.0.0.%' identified by '123';
      

      权限和用户分开管理

      必须先创建用户再授权

      create user 'wordpress'@'10.0.0.%' identified by '123';
      grant all on *.* to wordpress@'10.0.0.%';
      
    2. 8.0 之前使用的密码插件是mysql_native_password

      8.0 之后使用的密码插件是caching_sha2_password

      导致问题: 老的客户端程序, 连接不了8.0版本

      解决方法:

      • 创建用户时指定密码加密插件为mysql_native_password
      create user wordpress@'10.0.0.%' identified with mysql_native_password by '123';
      
      • 修改用户时替换密码加密插件为mysql_native_password
      alter user wordpress@'10.0.0.%' identified with mysql_native_password by '123';
      
      • 配置文件中指定默认加密插件为mysql_native_password
      
      

    修改用户

    alter user wordpress@'10.0.0.%' identified by '123';
    

    锁定用户

    alter user wordpress@'10.0.0.%' account lock;
    

    解锁用户

    alter user wordpress@'10.0.0.%' account unlock;
    

    删除用户

    drop user wordpress@'10.0.0.%';
    

    获取数据表结构

    desc mysql.user;
    

    查询所有mysql用户

    select user,host,authentication_string,plugin from mysql.user;
    

    设置别名as ""

    select user as "用户",host as "白名单",authentication_string as "密码",plugin as "插件" from mysql.user;
    

    查看帮助

    ? 或者 help
    

    查看创建用户帮助

    help create user;
    

    生产中开用户

    1. 如何沟通开用户
      1.是否有邮件批复
      2.对哪些库和表做操作
      3.做什么操作(增删改查)
      4.从什么地址来登录
    2. 开发人员找你要root用户密码?
      1.走流程拒绝他
      2.如果是金融类的公司
      (1)原则上是不允许任何非DBA人员持有或申请root
      (2)如果有人私下索要root密码,即时举报。

    三、权限管理

    作用:约束用户能够对数据库对象(库, 表)使用的功能(SQL)

    语法格式

    grant 权限 on 权限范围 to 用户;
    

    权限范围

    • 对于数据库及内部其他权限
    *.*               全局范围, 所有数据库
    数据库名.*        单库范围, 指定数据库中的所有
    数据库名.表        单表范围, 指定数据库中的某张表
    数据库名.存储过程     指定数据库中的存储过程
    
    • 对于用户和IP的权限
    用户名@IP地址      用户只能在该IP下才能访问
    用户名@192.168.1.%   用户只能在该IP段下才能访问(通配符%表示任意)
    用户名@%             用户可以再任意IP下访问(默认IP地址为%)
    

    权限列表

    查看所有权限列表

    show privileges;
    
    all:除 Grant option 外的所有权限
    
    alter:使用alter table
    alter routine:使用alter procedure和drop procedure
    create:使用create table
    create routine:使用create procedure
    create temporary tables:使用create temporary tables
    create user:使用create user、drop user、rename user和revoke  all privileges
    create view:使用create view
    delete:使用delete
    drop:使用drop table
    execute:使用call和存储过程
    file:使用select into outfile 和 load data infile
    grant option:使用grant 和 revoke
    index:使用index
    insert:使用insert
    lock tables:使用lock table
    process:使用show full processlist
    select:使用select
    show databases:使用show databases
    show view:使用show view
    update:使用update
    usage:无权限-仅允许连接
    reload:使用flush
    shutdown:使用mysqladmin shutdown(关闭MySQL)
    super:使用change master、kill、logs、purge、master和set global。还允许mysqladmin调试登陆
    replication client:服务器位置的访问
    replication slave:由复制从属使用
    ... ...
    

    权限类别

    管理类

    CREATE TEMPORARY TABLES
    CREATE USER
    FILE
    SUPER
    SHOW DATABASES
    RELOAD
    SHUTDOWN
    REPLICATION SLAVE
    REPLICATION CLIENT
    LOCK TABLES
    PROCESS
    

    程序类: FUNCTION、PROCEDURE、TRIGGER

    CREATE
    ALTER
    DROP
    EXCUTE
    

    库和表级别:DATABASE、TABLE

    ALTER
    CREATE
    CREATE VIEW
    DROP
    INDEX
    SHOW VIEW
    GRANT OPTION:能将自己获得的权限转赠给其他用户
    

    数据操作

    SELECT
    INSERT
    DELETE
    UPDATE
    

    字段级别

    SELECT(col1,col2,...)
    UPDATE(col1,col2,...)
    INSERT(col1,col2,...)
    

    所有权限

    ALL PRIVILEGES 或 ALL
    

    注意:

    ① MariaDB 服务进程启动时会读取mysql 库中所有授权表至内存

    ② GRANT 或 REVOKE 等执行权限操作会保存于系统表中,MariaDB 的服务进程通常会自动重读授权表,使之生效

    ③ 对于不能够或不能及时重读授权表的命令,可手动让MariaDB 的服务进程重读授权表:FLUSH PRIVILEGES;

    操作命令

    ① 授权

    grant 权限 on 数据库.表 to '用户'@'IP地址';
    

    不能重复授权, 重复授权会追加而不是覆盖

    ② 取消授权(回收权限)

    revoke 权限 on 数据库.表 from '用户名'@'IP地址';
    

    ③ 查看用户权限

    • 专用命令
    show grants for '用户'@'IP地址';
    
    • 查看授权表
    select * from mysql.user G;
    

    注意:用户权限相关数据保存在mysql数据库的user表中,所以也可以直接对其进行操作(不建议)

    加载mysql库
    use mysql;
    查看表名
    show tables;
    
    user        : user host auth plugin 全局范围授权的用户权限  (*.*)
    db          : user host auth plugin 单库范围授权的用户权限  (wp_user.*)
    table_priv  : user host auth plugin 单表范围授权的用户权限  (wp_user.d1)
    

    示例

    create user root@'10.0.0.%' identified with mysql_native_password by '123';
    grant all on *.* to root@'10.0.0.%';
    
    create user wp_user@'10.0.0.%' identified with mysql_native_password by '123';
    grant select,update,delete,insert on wordpress.* to  wp_user@'10.0.0.%';
    
    revoke delete on *.* to wp_user@'10.0.0.%';
    

    8.0 新特性

    角色 role

    创建角色

    create role app_rw;
    

    给角色授权

    grant select,update,delete,insert on wordpress.* to app_rw;
    

    创建用户

    create user test@'10.0.0.%' identified by '123';
    

    给用户授权

    grant app_rw to test@'10.0.0.%';
    

    查看当前登录用户所属角色

    select * from information_schema.APPLICABLE_ROLES;
    

    删除角色

    drop role app_rw;
    

    删除用户

    drop user test@'10.0.0.%';
    

    本地管理员( root@localhost 用户)

    管理员密码设定(root@localhost)

    [root@db01 ~]# mysqladmin password 1 # 设置密码为: 1
    [root@db01 ~]# mysqladmin -uroot -p password 123 # 修改密码为: 123
    Enter password:  # 输入旧密码: 1
    

    本地管理员 root@localhost 用户 忘记密码(误删除误修改)

    1. 关闭数据库
    [root@db01 ~]# systemctl stop mysqld
    
    1. 维护模式启动数据库
    [root@db01 ~]# mysqld_safe --skip-grant-tables --skip-networking &
    
    --skip-grant-tables  # 跳过授权表
    --skip-networking    # 跳过远程登录
    
    vim /etc/my.cnf
    [mysqld]
    skip-grant-tables=1
    skip-networking=1
    

    skip-networking=1:关闭TCP/IP网络连接,只侦听本地客户端, 所有和服务器的交互都通过一个socket实现,socket的yum安装默认存放在/var/lib/mysql/mysql.sock

    1,ON,TRUE,启用意义相同
    0,OFF,FALSE,关闭意义相同
    _和-相同
    
    1. 登录并修改密码
    [root@db01 ~]# mysql
    mysql> alter user root@'localhost' identified by '1';
    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 '1';
    Query OK, 0 rows affected (0.01 sec)
    mysql> exit
    

    如果 root@localhost 用户 (误删除误修改) 不存在

    误修改改回来就行

    [root@db01 ~]# mysql
    mysql> select user,host from mysql.user;
    +------------------+-----------+
    | user             | host      |
    +------------------+-----------+
    | mysql.infoschema | localhost |
    | mysql.session    | localhost |
    | mysql.sys        | localhost |
    | root             | 10.0.0.%  |
    +------------------+-----------+
    4 rows in set (0.00 sec)
    mysql> update mysql.user set host='localhost' where user='root' and host='10.0.0.%'
    mysql> exit
    

    误删除就只能重新建立, 不能使用 CREATE 创建语句, 只能使用 INSERT 插入语句直接编辑用户表

    1. 关闭数据库,正常启动验证
    [root@db01 ~]# mysql -uroot -p1
    

    四、连接管理

    自带客户端命令

    mysql

    mysqldump

    mysql 常用参数

    -u USERNAME:  用户名; 默认为root
    -h HOST:      服务器主机地址/主机名; 默认为localhost
    -p PASSWORD: 用户密码; 默认为空
    -P POST:     端口(大写字母); 默认为3306
    -s            静默
    -S            套接字位置(指定连接socket文件路径)
    -e            免交互执行SQL命令
    <             导入数据库恢复数据
    
    [root@db01 ~]# mysql -uroot -p123 -h 10.0.0.51 -P3306
    mysql> select @@socket;
    +-----------------+
    | @@socket        |
    +-----------------+
    | /tmp/mysql.sock |
    [root@db01 ~]# mysql -uroot -p123 -S /tmp/mysql.sock
    [root@db01 ~]# mysql -uroot -p123 -e "select user,host from mysql.user;"
    +---------------+-----------+
    | user          | host      |
    +---------------+-----------+
    | root          | 10.0.0.%  |
    | mysql.session | localhost |
    | mysql.sys     | localhost |
    | root          | localhost |
    +---------------+-----------+
    [root@db01 ~]# mysql -uroot -p123 < mysql.sql
    [root@db01 ~]# mysql -uroot -p1 -e 'source /root/world.sql'
    

    mysql 命令连接

    mysql服务器监听两种socket地址:

    1. unix sock: 监听在sock文件上,仅支持本机通信,host为localhost,127.0.0.1时自动使用unix sock
    2. ip socket: 监听在tcp的3306端口,支持远程通信

    ① 本地(socket文件)连接

    前提条件: 提前创建 localhost 用户和密码

    mysql -uroot -p123 -S /tmp/mysql.sock
    

    连接错误①:不能连接套接字文件

    ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2), it means that the MySQL server daemon (Unix) or service (Windows) is not running.
    

    解决方案:检查配置文件指定路径,检查MySQL是否启动

    ② 远程网络连接串(TCP/IP)连接

    前提条件: 提前创建 远程连接(IP) 用户和密码

    mysql -uroot -p123 -h10.0.0.51 -P3306
    

    mysql 内置命令

    help 					打印mysql帮助
    c  ctrl+c 				结束上个命令运行
    q quit; exit; ctrl+d 	退出mysql连接
    G 						将数据竖起来显示
    source 					恢复备份文件	
    

    mysqld 帮助

    # 获取mysqld的可用选项列表
    mysqld --help --verbose
    # 获取mysqld的默认设置
    mysqld --print-defaults
    

    MySQL服务器

    MariaDB选项,系统和状态变量的完整列表


    开发工具

    sqlyog

    navicat

    workbench(官方开源)


    程序(驱动)连接

    PHP

    python

    go

    java

    五、配置文件

    初始化方式

    1. 源码包, 编译时配置参数(CMAKE)
    2. 命令行启动时指定配置参数
    3. 配置文件配置参数:类ini格式,集中式的配置

    如果冲突,命令行优先级最高


    配置文件默认读取路径

    [root@db01 ~]# mysqld --help --verbose | grep my.cnf | head -1
    /etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf 
    

    注意:

    1. 默认情况下,MySQL启动时,从左到右依次读取以上配置文件,如果有重复选项,以最后一个文件设置的为准。

    2. 启动服务时, 强制指定读取那个配置文件 --defautls-file

    [root@db01 ~]# mysqld --defaults-file=/tmp/aa.txt &
    [root@db01 ~]# mysqld_safe --defaults-file=/tmp/aa.txt &
    

    配置文件结构

    [root@db01 ~]# cat >/etc/my.cnf << EOF
    # 服务器端配置
    [mysqld]
    # 用户
    user=mysql   
    # 软件安装目录                
    basedir=/application/mysql  
    # 数据存放路径
    datadir=/data/mysql/data 
    # socket文件路径
    socket=/tmp/mysql.sock
    # 服务器id号
    server_id=6
    # 端口号
    port=3306
    # 客户端配置
    [mysql]
    # socket文件路径
    socket=/tmp/mysql.sock
    EOF
    
    标签:
         服务端: [mysqld] [mysqld_safe] [server] [mysqld_safe] [mysqld_multi](多实例)
                影响: 数据库启动,初始化
         客户端: [mysql] [mysqladmin] [mysqldump] [client]
                影响: 只影响到本机客户端程序运行
    
    格式:parameter = value
    

    服务器端设置

    获取系统变量

    SHOW GLOBAL VARIABLES;
    SHOW [SESSION] VARIABLES;
    SELECT @@VARIABLES;
    

    服务器状态变量(只读):用于保存mysqld运行中的统计数据的变量,不可更改

    -- 全局
    SHOW GLOBAL STATUS;
    -- 会话
    SHOW [SESSION] STATUS;
    

    设置服务器变量的值:分全局和会话两种

    help SET
    

    设置全局变量:仅对修改后新创建的会话有效,对已经建立的会话无效,重启mysqld服务失效

    SET GLOBAL system_var_name=value;
    SET @@global.system_var_name=value;
    

    设置会话变量:仅对当前建立的会话有效

    SET [SESSION] system_var_name=value;
    SET @@[session.]system_var_name=value;
    

    设置服务器选项:重启永久生效

    vim /etc/my.cnf
    [mysqld]
    ...
    

    六、启动关闭

    img

    以上多种方式,都可以单独启动MySQL服务
    mysqld_safe和mysqld一般是在临时维护时使用。
    从 CentOS 7 系统开始,支持systemd直接调用mysqld的方式进行启动数据库
    

    image-20201103102826061

    启动

    /usr/local/mysql/bin/mysqld &

    • 二进制文件
    • 只有启动没有关闭, 不记录日志

    /usr/local/mysql/bin/mysqld_safe &

    • shell脚本
    • 只有启动没有关闭, 记录日志, 监控状态, 异常重启, ... ...

    /usr/local/mysql/support-files/mysql.server {start|stop|restart|reload|force-reload|status}

    service mysqld (start, stop, restart, try-restart, reload, force-reload, status)

    systemctl mysqld {start|stop|restart|reload|enable|disable|status}


    关闭

    /usr/local/mysql/bin/mysqladmin -uroot -p1 shutdown

    [root@db01 ~]#  /usr/local/mysql/bin/mysql -uroot -p1
    mysql> shutdown;
    # 8.0新特性
    mysql> restart;
    

    /usr/local/mysql/support-files/mysql.server stop

    service mysqld stop

    systemctl mysqld stop

    七、多实例

    官方文档

    MySQL5.7.12之后默认开启MySQL X插件, 监听33060端口, 多实例时必须关闭

    查看

    [root@db01 ~]# netstat -tupln | grep mysqld
    tcp6       0      0 :::3306                 :::*                    LISTEN      2385/mysqld
    tcp6       0      0 :::33060                :::*                    LISTEN      2385/mysqld
    

    关闭

    ① 命令行启动使用参数: --mysqlx=0--skip-mysqlx

    ② 配置文件/etc/my.cnf[mysqld]添加配置mysqlx=0

    单版本多实例

    1. 规划相关目录
    mkdir /mysql/330{7,8,9}/{data,etc,socket,log,pid} -pv
    chown -R mysql.mysql /mysql
    
    1. 准备配置文件
    cat > /mysql/3307/my.cnf <<EOF
    [mysqld]
    user=mysql
    basedir=/usr/local/mysql
    datadir=/mysql/3307/data
    socket=/mysql/3307/mysql.sock
    port=3307
    server_id=7
    log_error=/mysql/3307/mysql.log
    log_bin=/mysql/3307/mysql-bin
    EOF
    
    cat > /mysql/3308/my.cnf <<EOF
    [mysqld]
    user=mysql
    basedir=/usr/local/mysql
    datadir=/mysql/3308/data
    socket=/mysql/3308/mysql.sock
    port=3308
    server_id=8
    log_error=/mysql/3308/mysql.log
    log_bin=/mysql/3308/mysql-bin
    EOF
    
    cat > /mysql/3309/my.cnf <<EOF
    [mysqld]
    user=mysql
    basedir=/usr/local/mysql
    datadir=/mysql/3309/data
    socket=/mysql/3309/mysql.sock
    port=3309
    server_id=9
    log_error=/mysql/3309/mysql.log
    log_bin=/mysql/3309/mysql-bin
    EOF
    
    1. 初始化三套数据并授权
    mv /etc/my.cnf /etc/my.cnf.bak
    mysqld --initialize-insecure  --user=mysql --datadir=/mysql/3307/data --basedir=/usr/local/mysql
    mysqld --initialize-insecure  --user=mysql --datadir=/mysql/3308/data --basedir=/usr/local/mysql
    mysqld --initialize-insecure  --user=mysql --datadir=/mysql/3309/data --basedir=/usr/local/mysql
    chown -R mysql.mysql /mysql
    
    1. 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=/usr/local/mysql/bin/mysqld --defaults-file=/mysql/3307/my.cnf --mysqlx=0
    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=/usr/local/mysql/bin/mysqld --defaults-file=/mysql/3308/my.cnf --mysqlx=0
    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=/usr/local/mysql/bin/mysqld --defaults-file=/mysql/3309/my.cnf --mysqlx=0
    LimitNOFILE = 5000
    EOF
    
    1. 启动
    systemctl start mysqld3307.service
    systemctl start mysqld3308.service
    systemctl start mysqld3309.service
    
    1. 验证多实例
    netstat -tlnp | grep 330
    mysql -S /mysql/3307/mysql.sock -e "select @@server_id"
    mysql -S /mysql/3308/mysql.sock -e "select @@server_id"
    mysql -S /mysql/3309/mysql.sock -e "select @@server_id"
    

    多版本多实例

    1. 解压二进制包和软链接
    [root@db01 opt]# tar xf mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz 
    [root@db01 opt]# tar xf mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz
    [root@db01 opt]# ln -s /opt/mysql-5.6.46-linux-glibc2.12-x86_64 /usr/local/mysql56
    [root@db01 opt]# ln -s /opt/mysql-5.7.30-linux-glibc2.12-x86_64 /usr/local/mysql57
    
    1. 创建相关目录并授权
    mkdir /mysql/33{16,17}/{data,etc,socket,log,pid} -pv
    chown -R mysql.mysql /mysql
    
    1. 准备配置文件
    cat > /mysql/3316/my.cnf <<EOF
    [mysqld]
    user=mysql
    basedir=/usr/local/mysql56
    datadir=/mysql/3316/data
    socket=/mysql/3316/mysql.sock
    port=3316
    server_id=16
    log_error=/mysql/3316/mysql.log
    log_bin=/mysql/3316/mysql-bin
    EOF
    
    cat > /mysql/3317/my.cnf <<EOF
    [mysqld]
    user=mysql
    basedir=/usr/local/mysql57
    datadir=/mysql/3317/data
    socket=/mysql/3317/mysql.sock
    port=3317
    server_id=17
    log_error=/mysql/3317/mysql.log
    log_bin=/mysql/3317/mysql-bin
    EOF
    
    1. 初始化两套数据并授权
    /usr/local/mysql56/scripts/mysql_install_db --user=mysql --datadir=/mysql/3316/data --basedir=/usr/local/mysql56
    /usr/local/mysql57/bin/mysqld --initialize-insecure  --user=mysql --datadir=/mysql/3317/data --basedir=/usr/local/mysql57
    chown -R mysql.mysql /mysql
    
    1. systemd管理多实例并加载
    cat > /etc/systemd/system/mysqld3316.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=/usr/local/mysql56/bin/mysqld --defaults-file=/mysql/3316/my.cnf
    LimitNOFILE = 5000
    EOF
    
    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=/usr/local/mysql57/bin/mysqld --defaults-file=/mysql/3317/my.cnf
    LimitNOFILE = 5000
    EOF
    
    systemctl daemon-reload
    
    1. 启动
    systemctl start mysqld3316.service
    systemctl start mysqld3317.service
    
    1. 验证多实例
    netstat -tlnp | grep 331
    mysql -S /mysql/3316/mysql.sock -e "select @@server_id"
    mysql -S /mysql/3317/mysql.sock -e "select @@server_id"
    

    八、升级

    升级方式

    1. inplace (就地升级)

      适合于主从环境, 先升级从库, 没问题再升级主库

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


    INPLACE 升级注意事项

    官网说明

    5.6

    • 仅在一般可用性(GA)版本之间支持升级。
    • 支持从MySQL 5.5升级到5.6。建议先升级到最新版本,然后再升级到下一版本。例如,在升级到MySQL 5.6之前,先升级到最新的MySQL 5.5版本。
    • 不支持跳过版本的升级。例如,不支持直接从MySQL 5.1升级到5.6。
    • 支持在发行系列中进行升级。例如,支持从MySQL 5.6.x 升级至5.6.y。还支持跳过发行版。例如,从MySQL 5.6.x升级至5.6.z支持。

    5.7

    • 仅在一般可用性(GA)版本之间支持升级。
    • 支持从MySQL 5.6升级到5.7。建议先升级到最新版本,然后再升级到下一版本。例如,在升级到MySQL 5.7之前,先升级到最新的MySQL 5.6版本。
    • 不支持跳过版本的升级。例如,不支持从MySQL 5.5直接升级到5.7。
    • 支持在发行系列中进行升级。例如,支持从MySQL 5.7.x升级至5.7.y。还支持跳过发行版。例如,从MySQL 5.7.x升级至5.7.z支持。

    8.0

    • 支持从MySQL 5.7升级到8.0。但是,仅在一般可用性(GA)版本之间支持升级。对于MySQL 8.0,要求您从MySQL 5.7 GA版本(5.7.9或更高版本)升级。不支持从非GA版本的MySQL 5.7升级。
    • 建议先升级到最新版本,然后再升级到下一版本。例如,在升级到MySQL 8.0之前,先升级到最新的MySQL 5.7版本。
    • 不支持跳过版本的升级。例如,不支持直接从MySQL 5.6升级到8.0。
    • 某个发行系列达到通用(GA)状态后,便支持在该发行系列中进行升级(从一个GA版本升级到另一个GA版本)。例如,支持从MySQL 8.0.x升级到8.0.y。(不支持涉及开发状态非GA版本的升级。)还支持跳过版本。例如,支持从MySQL 8.0.x升级到8.0.z。MySQL 8.0.11是MySQL 8.0发行系列中的第一个GA状态发行版。

    总结

    • 仅支持GA版本之间升级,不支持跳过版本的升级,支持从MySQL 5.7升级到8.0

    • 5.6 --> 5.7 ,先将5.6升级至最新版,再升级到5.7

    • 5.5 --> 5.7 ,先将5.5升级至最新,再 5.5 --> 5.6 最新,再 5.6 --> 5.7 最新

    • 回退方案要提前考虑好,最好升级前要备份(特别是往8.0版本升级)。

    • 降低停机时间(停业务的时间)


    INPLACE 升级过程原理

    1. 备份原数据库数据
    2. 安装新版本软件
    3. 关闭原数据库(网站挂维护页)
    4. 使用新版本软件 “挂” 旧版本数据启动(--skip-grant-tables ,--skip-networking)
    5. 升级(只是升级系统表,升级时间和数据量无关)
    6. 正常重启数据库
    7. 验证各项功能是否正常
    8. 恢复业务

    INPLACE 升级演练 5.6.46 ---> 5.7.30

    1. 安装 新(5.7.30)版本软件

    2. 优雅关闭库(等待所有正在进行的事务运行完毕再关库)

    mysql -S /mysql/3316/mysql.sock -e "set global innodb_fast_shutdown=0;"
    mysql -S /mysql/3316/mysql.sock -e "select @@innodb_fast_shutdown;"
    +------------------------+
    | @@innodb_fast_shutdown |
    +------------------------+
    |                      0 |
    +------------------------+
    mysql -S /mysql/3316/mysql.sock -e "shutdown;"
    
    1. 冷备
    cp -r /mysql/3316/data/ /tmp/3316bak
    
    1. 修改配置文件, 使用高版本(5.7.30)软件挂低版本(5.6.48)数据启动
    cat > /mysql/3316/my.cnf <<EOF
    [mysqld]
    user=mysql
    basedir=/usr/local/mysql57
    datadir=/mysql/3316/data
    socket=/mysql/3316/mysql.sock
    port=3316
    server_id=16
    log_error=/mysql/3316/mysql.log
    log_bin=/mysql/3316/mysql-bin
    EOF
    
    /usr/local/mysql57/bin/mysqld_safe --defaults-file=/mysql/3316/my.cnf --skip-grant-tables --skip-networking &
    
    1. 升级(升级到8.0可以省略此步骤)
    /usr/local/mysql57/bin/mysql_upgrade -S /mysql/3316/mysql.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.
    
    1. 修改并重载systemd管理配置文件
    cat > /etc/systemd/system/mysqld3316.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=/usr/local/mysql57/bin/mysqld --defaults-file=/mysql/3316/my.cnf
    LimitNOFILE = 5000
    EOF
    systemctl daemon-reload
    
    1. 关闭数据库并正常启动
    /usr/local/mysql57/bin/mysqladmin -S /mysql/3316/mysql.sock shutdown
    systemctl start mysqld3316
    
    1. 验证
    mysql -S /mysql/3316/mysql.sock -e "select user,host from mysql.user;"
    +---------------+-----------+
    | user          | host      |
    +---------------+-----------+
    | root          | 127.0.0.1 |
    | root          | ::1       |
    |               | db01      |
    | root          | db01      |
    |               | localhost |
    | mysql.session | localhost |
    | mysql.sys     | localhost |
    | root          | localhost |
    +---------------+-----------+
    mysql -S /mysql/3316/mysql.sock -e "SELECT @@VERSION;"
    +------------+
    | @@VERSION  |
    +------------+
    | 5.7.30-log |
    +------------+
    

    INPLACE 升级演练 5.7.30 ---> 8.0.20

    1. 安装 新(8.0.20)版本软件

    2. 优雅关闭库(等待所有正在进行的事务运行完毕再关库)

    mysql -S /mysql/3317/mysql.sock -e "set global innodb_fast_shutdown=0;"
    mysql -S /mysql/3317/mysql.sock -e "select @@innodb_fast_shutdown;"
    +------------------------+
    | @@innodb_fast_shutdown |
    +------------------------+
    |                      0 |
    +------------------------+
    mysql -S /mysql/3317/mysql.sock -e "shutdown;"
    
    1. 冷备
    cp -r /mysql/3317/data/ /tmp/3317bak
    
    1. 修改配置文件, 使用高版本(8.0.20)软件挂低版本(5.7.30)数据启动
    cat > /mysql/3317/my.cnf << EOF
    [mysqld]
    user=mysql
    basedir=/usr/local/mysql
    datadir=/mysql/3317/data
    socket=/mysql/3317/mysql.sock
    port=3317
    server_id=17
    log_error=/mysql/3317/mysql.log
    log_bin=/mysql/3317/mysql-bin
    mysqlx=0
    EOF
    
    /usr/local/mysql/bin/mysqld_safe --defaults-file=/mysql/3317/my.cnf --skip-grant-tables --skip-networking &
    
    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=/usr/local/mysql/bin/mysqld --defaults-file=/mysql/3317/my.cnf
    LimitNOFILE = 5000
    EOF
    systemctl daemon-reload
    
    1. 关闭数据库并正常启动
    /usr/local/mysql/bin/mysqladmin -S /mysql/3317/mysql.sock shutdown
    systemctl start mysqld3317
    
    1. 验证
    mysql -S /mysql/3317/mysql.sock -e "select user,host from mysql.user;"
    +------------------+-----------+
    | user             | host      |
    +------------------+-----------+
    | mysql.infoschema | localhost |
    | mysql.session    | localhost |
    | mysql.sys        | localhost |
    | root             | localhost |
    +------------------+-----------+
    mysql -S /mysql/3317/mysql.sock -e "SELECT @@VERSION;"
    +-----------+
    | @@VERSION |
    +-----------+
    | 8.0.20    |
    +-----------+
    

    升级前预检查

    1. mysqlsh ( 最低8.0.20 ) 安装
    [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]# echo export PATH=$PATH:/usr/local/mysqlsh/bin/ >> /etc/profile && . /etc/profile
    
    1. 验证安装
    [root@db01 opt]# mysqlsh --version
    mysqlsh  Ver 8.0.20 for Linux on x86_64 - for MySQL 8.0.20 (MySQL Community Server (GPL))
    
    1. 在 5.7.30 数据库中创建远程用户
    mysql -S /tmp/mysql3317.sock -e "create user root@'10.0.0.%' identified with mysql_native_password by '123';"
    mysql -S /tmp/mysql3317.sock -e "grant all on *.* to root@'10.0.0.%';"
    
    1. 升级前检测
    mysqlsh root:123@10.0.0.51:3317 -e "util.checkForServerUpgrade()" > /tmp/upcheck.log
    
  • 相关阅读:
    git clone GitLab 工程报错Repository not found
    vue + Element-ui 实现分页
    Element-ui 实现table的合计功能
    python 使用UUID库生成唯一ID
    css 设置overflow:scroll 滚动条的样式
    下载css-loader 安装及使用
    vue实现首页导航切换不同路由的方式(二)【使用vuex实现的】
    vue实现随机验证码功能
    vue实现首页导航切换不同路由的方式
    vue实现菜单切换
  • 原文地址:https://www.cnblogs.com/backups/p/mysql_2.html
Copyright © 2011-2022 走看看