MySQL中的用户不是只看用户名

MySQL的用户组成:

  • 用户名

  • 主机域

MySQL用户的作用

  • 登陆MySQL数据库
  • 管理数据对象

用户的定义:

  • 1) username@主机域

  • 2)主机域:可以理解为是MySQL登陆的白名单

  • 3)主机域格式:

    • 172.16.1.%

    • 172.16.%.%

    • 172.%.%.%

    • %

    • 172.16.1.0/255.255.255.0

    • 172.16.1.5%(172.16.1.50-59 172.16.1.5)

    MySQL用户密码管理

    ## MySQL5.6修改密码
    #方法一
    [root@db01 ~]# mysqladmin -uroot -p password'111'
    
    #方法二
    mysql> set password=PASSWORD('666');
    
    #方法三 update修改密码(配合刷新授权表)
    mysql> update mysql.user set password=PASSWORD('222') where user='root' and host='localhost';
    
    mysql> flush privileges; //(只有在修改密码时,才需要用到)
    
    #方法四
    mysql> grant all on *.* to root@'localhost' identified by '123';
    
    ## MySQL5.7修改密码
    #方法一
    mysql> alter user root@'localhost' identified by '123';
    
    #方法二
    mysql> set password=PASSWORD('111');
    (只能修改当前登陆的用户)
    
    #方法三  update修改密码(配合刷新授权表)
    mysql> update mysql.user set authentication_string=PASSWORD('222') where user='root' and host='localhost';
    mysql> flush privileges; //(只有在修改密码时,才需要用到)
    
    #方法四
    mysql> grant all on *.* to root@'localhost' identified by '123';
    
    #方法五
    [root@db03 ~]# mysqladmin -uroot -p password '789'

    忘记root密码

    # 1.停止mysql服务
    [root@db01 ~]# /etc/init.d/mysqld stop
    # 2.跳过授权 直接登陆mysql
    [root@db01 ~]# mysqld --user=mysql --skip-grant-tables &
    # 3.启动mysql 修改用户密码
    [root@db01 ~]# mysql
    mysql> update mysql.user set authentication_string=PASSWORD('123') where user='root' and host='localhost';
    mysql> flush privileges;
    # 4. 重启mysql
    [root@db01 ~]# /etc/init.d/mysqld restart

    权限管理

    MySQL的权限定义:
    作用对象:库、表
    用户权限

    INSERT,SELECT, UPDATE, DELETE,  # 这前四个比较常用 都是对表的权限分别是 增 删 改 查
    CREATE, DROP, RELOAD, SHUTDOWN,  PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE

    归属
    每次设定只能有一个属主,没有属组或其他用户的概念

    grant    all     on   *.*     to user@'%'    identified by '123';
          所有权限       库.表      用户@主机域       密码

    作用对象分解

    *.* [当前MySQL实例中所有库下的所有表]
    wordpress.* [当前MySQL实例中wordpress库中所有表(单库级别)]
    wordpress.user [当前MySQL实例中wordpress库中的user表(单表级别)]

    权限的设定

    开发人员说:请给我开一个用户

    沟通:

    • 你需要对哪些库、表进行操作

    • 你从哪里连接过来

    • 用户名有没有要求

    • 密码要求

    • 发邮件

    #一般给开发创建用户权限
    grant select,update,insert on lol.* to dev@'10.0.0.%' identified by '复杂一点';
    # 一般来说 企业里不会给开发删除权限
    grant select,update,insert,delete on lol.* to dev@'10.0.0.%' identified by '复杂一点';
    
    ## 脱敏:脱离敏感信息
    mysql> grant select(user,host),update,insert on mysql.user to dev1@'localhost'
    identified by '123';

    mysql 连接管理

    mysql

    -u 指定用户
    -p 指定密码
    -h 指定主机域
    -S 指定socket
    -P 指定端口
    
    -e 免交互执行SQL语句
    ----------------------
    
    --protocol=name:指定连接方式(第三方的连接工具)

    MySQL启动关闭流程

    img

    # 复制mysql下的启动脚本到启动目录下做启动文件
    cp /app/mysql/support-files/mysql.server /etc/init.d/mysqld
    
    # 启动mysql
    [root@db02 ~]# /etc/init.d/mysqld start
    
    # 启动命令并指定了启动文件
    [root@db02 ~]# /app/mysql/bin/mysqld --defaults-file=/etc/my.cnf --user=mysql
    
    # 跳过授权表并只能本地访问
    # mysqld_safe --skip-grant-tables --skip-networking
    
    # 编辑service启动文件
    [root@db02 system]# vim /usr/lib/systemd/system/mysqld.service
    [Unit]
    Description=mysqld
    
    [Service]
    #Type=notify
    ExecStart=/app/mysql/bin/mysqld --defaults-file=/etc/my.cnf --user=mysql
    KillMode=process
    Restart=on-failure
    RestartSec=42s
    
    [Install]
    WantedBy=multi-user.target
    
    # 重载配置文件
    [root@db02 system]# systemctl daemon-reload
    
    # 把mysql设置为开机自启
    [root@db02 system]# systemctl enable mysqld
    
    ### 二进制使用systemctl启动mysqld一定要加上这两行
    [mysqld]
    basedir=/app/mysql
    datadir=/app/mysql/data

    启动方式

    /etc/init.d/mysqld start
    
    systemctl start mysqld
    
    /app/mysql/bin/mysqld --defaults-file=/etc/my.cnf --user=mysql

    停止方式

    /etc/init.d/mysqld stop
    
    systemctl stop mysqld
    
    mysqladmin -uroot -p222 shudown
    
    # kill
    kill -9 pid
    pikill mysqld
    pikill -9 pid
    killall mysqld

    MySQL的配置管理

    • 预编译:cmake去指定,硬编码到程序当中去

    • 配置文件

    • /etc/my.cnf

    • /etc/mysql/my.cnf

    • $basedir/my.cnf

    • default-extra-file

    • ~/.my.cnf

    # 配置文件的读取顺序,从上往下读取配置文件,但如果指定文件,就走指定文件的路径
    例:--defaults-file=/etc/my.cnf
    
    # 后写入的文件会优先于前面写入的文件
    • 在命令行设定启动初始化配置

    思考问题:

    #cmake:
    socket=/application/mysql/tmp/mysql.sock
    #命令行:
    --socket=/tmp/mysql.sock
    #配置文件:
    /etc/my.cnf中[mysqld]标签下:socket=/opt/mysql.sock
    #default参数:
    --defaults-file=/tmp/a.txt配置文件中[mysqld]标签下:socket=/tmp/test.sock
    
    预编译:/app/mysql/tmp/mysql.sock
    命令行:/tmp/mysql.sock
    默认配置文件/etc/my.cnf:/opt/mysql.sock
    --defaults-file:/tmp/test.sock
    
    启动MySQL后,socket在哪,叫啥名?
    /tmp
    - mysql.sock
    - test.sock
    /opt
    - mysql.sock
    
    # 执行命令
    /app/mysql/bin/mysqld --defaults-file=/tmp/a.txt --user=mysql --socket=/tmp/mysql.sock
    # 结论
    在/tmp/mysql.sock
    因为在命令行指定了socket的文件路径

    MySQL配置优先级

    • 1.命令行
    • 2.配置文件
    • 2.1 ~/.my.cnf
    • 2.2 default-extra-file
    • 2.3 /app/mysql/my.cnf
    • 2.4 /etc/mysql/my.cnf
    • 2.5 /etc/my.cnf
    • 3.预编译

    MySQL配置文件中标签的作用

    [mysqld]     //影响服务端的启动
    [mysql]      //影响客户端的连接(影响mysql)
    [mysqladmin] //影响客户端的mysqladmin
    
    [server]     //影响服务端的启动
    [client]     //影响客户端的连接(mysql、mysqladmin、mysqldump)

    MySQL多实例

    单实例:一个进程 + 多个线程 + 一个预分配的内存结构

    多实例:多个进程 + 多个线程 + 多个预分配的内存结构(基本在测试环境中使用)

    先决条件

    共享同一个basedir

    数据目录不同 datadir

    • 多个配置文件
    • socket
    • port
    • log
    • pid文件

    实施MySQL多实例

    # 创建多实例目录
    mkdir -p /data/330{7,8,9}/data
    ## 目录结构
    [root@db02 ~]# tree /data/
    /data/
    ├── 3307
    │   └── data
    ├── 3308
    │   └── data
    └── 3309
      └── data
    
    # 准备配置文件
    [root@db02 ~]# vim /data/3307/my.cnf
    [mysqld]
    basedir=/app/mysql
    datadir=/data/3307/data
    port=3307
    socket=/data/3307/mysql.sock
    log_error=/data/3307/mysql.log
    pid_file=/data/3307/mysql.pid
    
    [root@db02 ~]# vim /data/3308/my.cnf
    [mysqld]
    basedir=/app/mysql
    datadir=/data/3308/data
    port=3308
    socket=/data/3308/mysql.sock
    log_error=/data/3308/mysql.log
    pid_file=/data/3308/mysql.pid
    
    [root@db02 ~]# vim /data/3309/my.cnf
    [mysqld]
    basedir=/app/mysql
    datadir=/data/3309/data
    port=3309
    socket=/data/3309/mysql.sock
    log_error=/data/3309/mysql.log
    pid_file=/data/3309/mysql.pid
    ## 目录结构
    [root@db02 ~]# tree /data
    /data
    ├── 3307
    │   ├── data
    │   └── my.cnf
    ├── 3308
    │   ├── data
    │   └── my.cnf
    └── 3309
      ├── data
      └── my.cnf
    
    # 多实例初始化
    cd /app/mysql/scripts/
    [root@db02 scripts]# ./mysql_install_db --defaults-file=/data/3307/my.cnf --basedir=/app/mysql --datadir=/data/3307/data
    
    [root@db02 scripts]# ./mysql_install_db --defaults-file=/data/3308/my.cnf --basedir=/app/mysql --datadir=/data/3308/data
    
    [root@db02 scripts]# ./mysql_install_db --defaults-file=/data/3309/my.cnf --basedir=/app/mysql --datadir=/data/3309/data
    ## 目录结构
    [root@db02 scripts]# tree /data/ -L 2
    /data/
    ├── 3307
    │   ├── data
    │   ├── my.cnf
    │   └── mysql.log
    ├── 3308
    │   ├── data
    │   ├── my.cnf
    │   └── mysql.log
    └── 3309
      ├── data
      ├── my.cnf
      └── mysql.log
    
    # 授权
    [root@db02 scripts]# chown -R mysql.mysql /data
    
    # 多实例启动
    /app/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf --user=mysql
    
    # 最优方法
    [root@db02 system]# vim /usr/lib/systemd/system/mysql3307.service
    [Unit]
    Description=mysqld
    
    [Service]
    #Type=notify
    ExecStart=/app/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf --user=mysql
    KillMode=process
    Restart=on-failure
    RestartSec=42s
    
    [Install]
    WantedBy=multi-user.target
    
    # 重载配置文件
    [root@db02 system]# systemctl daemon-reload
    
    # 启动3307端口的mysql
    [root@db02 system]# systemctl start mysql3307
    
    # 多实例创建密码
    [root@db02 system]# mysqladmin -uroot -p -S /data/3307/mysql.sock password '123'
    
    # 连接多实例
    ##方法1
    [root@db02 system]# mysql -uroot -p123 -S /data/3307/mysql.sock
    
    ##方法2
    [root@db02 system]# vim /usr/local/bin/mysql3307
    mysql -uroot -p123 -S /data/3307/mysql.sock
    ###赋予执行权限
    [root@db02 system]# chmod +x /usr/local/bin/mysql3307
    ###连接mysql
    mysql3307