• contos7下docker安装MySQL,MySQL开启远程连接,MySQL新建数据库,MySQL新建用户并授权


     一、docker获取MySQL5.7镜像并运行容器

    获取指定的镜像MySQL5.7:

    docker pull mysql:5.7

    查看镜像:

    docker images

    运行镜像下载的镜像构建MySQL容器:

    docker run --name mysql5.7 -p 3306:3306 -e MYSQL\_ROOT\_PASSWORD=123456 -d mysql:5.7
     
    创建成功,查看一下运行状态:
    docker ps

     运行成功...(^-^)V

     

    二、挂载外部配置和数据

    运行过程中,MySQL的数据和配置文件一般不会定义在容器内部,防止容器或docker的问题导致数据和配置的丢失,所以要把配置和数据放在外部

    进入刚才运行的容器:

    docker exec -it mysql5.7 /bin/bash

    查看配置文件my.cnf:

    cat /etc/mysql/my.cnf

     查看配置文件mysqld.cnf:

    cat /etc/mysql/mysql.conf.d/mysqld.cnf

    ①、把输出的内容复制一下,我们在本地先建一个同名文件,把内容粘贴进去;

    ②、也可以直接从docker中把文件下载到本地

    先进入你的目标文件夹:

    /root/mydata/mysql/conf

    再通过命令:

    docker container cp ae3bf138ce0f:/etc/mysql/ .

    注意那个点.

     再将配置文件从下载的文件夹中取出并放入conf文件夹中:

    cp mysqld.cnf /root/mydata/mysql/conf

    下一步停止并删除mysql5.7容器,后面挂载了外部数据的时候重新创建。

    docker stop mysql5.7
    docker rm mysql5.7

    执行下面的命令创建容器:

    docker run --name mysql5.7 --restart always --privileged=true -p 3306:3306 -v /root/mydata/mysql/conf/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -v /root/mydata/mysql/data:/var/lib/mysql -e MYSQL_USER="yourname" -e MYSQL_PASSWORD="yourpassword" -e MYSQL_ROOT_PASSWORD="rootpassword" -d mysql:5.7
    –restart always:开机启动
    –privileged=true:提升容器内权限
    -v /opt/mysql/config/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf:映射配置文件
    -v /opt/mysql/data:/var/lib/mysql:映射数据目录
    -e MYSQL_USER=”fengwei”:添加用户fengwei
    -e MYSQL_PASSWORD=”pwd123”:设置fengwei的密码伟pwd123
    -e MYSQL_ROOT_PASSWORD=”rootpwd123”:设置root的密码伟rootpwd123
    特别说明:如果没有添加--privileged=true参数,容器创建后不能正常启动,查看日志发现有权限的错误。

     挂载外部配置和数据的容器就创建好了!

    三、开启外部链接配置

    ①、防火墙设置

    如使用的阿里云的服务器,可以不设置防火墙的端口。因为阿里云有安全组,可以关闭防火墙,直接开启安全组中的端口即可

    CentOS7防火墙开启与关闭以及开放6379,3306,80等端口

    CentOS7用firewall防火墙替代了原来的iptables,所以我们应该使用firewall的一些命令。

    1.关闭防火墙

    systemctl stop firewalld.service            #停止firewall
    systemctl disable firewalld.service         #禁止firewall开机启动

    2.开启某个端口

    firewall-cmd --zone=public --add-port=8080/tcp --permanent
    firewall-cmd --zone=public --add-port=3306/tcp --permanent
    firewall-cmd --zone=public --add-port=6379/tcp --permanent

    命令含义

    –zone #作用域
    –add-port=80/tcp #添加端口,格式为:端口/通讯协议
    –permanent #永久生效,没有此参数重启后失效

    比如不拦截redis的6379端口

    3.重启防火墙

    firewall-cmd --reload

    4.其他常用命令:

    firewall-cmd --state                          ##查看防火墙状态,是否是running
    firewall-cmd --reload                          ##重新载入配置,比如添加规则之后,需要执行此命令
    firewall-cmd --get-zones                      ##列出支持的zone
    firewall-cmd --get-services                    ##列出支持的服务,在列表中的服务是放行的
    firewall-cmd --query-service ftp              ##查看ftp服务是否支持,返回yes或者no
    firewall-cmd --add-service=ftp                ##临时开放ftp服务
    firewall-cmd --add-service=ftp --permanent    ##永久开放ftp服务
    firewall-cmd --remove-service=ftp --permanent  ##永久移除ftp服务
    firewall-cmd --add-port=80/tcp --permanent    ##永久添加80端口 
    iptables -L -n                                ##查看规则,这个命令是和iptables的相同的
    man firewall-cmd                              ##查看帮助
    
    更多命令,使用 firewall-cmd --help 查看帮助文件

    如果有安全组,则可以关闭防火墙

    systemctl stop firewalld.service

    ②、添加安全组(是云服务器需要做)

     ③、开放MySQL的外部访问权限(否者外部无法连接)

    进入容器:

    docker exec -it mysql5.7 /bin/bash

    登录MySQL回车 输入密码 rootpassword:

    mysql -uroot -p 

    修改 root 远程连接权限:

    alter user 'root'@'%' identified with mysql_native_password by 'rootpassword';

     

    5.测试mysqlworkbanch连接 别的工具也可以

    二、添加数据库: 

    先使用 root 用户添加数据库:

    -- 进入sql服务后首先查看有哪些数据库
    show databases;
    
    -- 若没有新建一个
    CREATE DATABASE database_test;
    
    -- 使用数据库
    use database_test;

    新建表并使用查看

    -- 新建表:
    CREATE TABLE table_test(name char(20),author char(20));
    CREATE TABLE table_test_1(name char(20),author char(20));
    
    -- 查看表的内容:SELECT * FROM xxx;
    SELECT * FROM table_test;
    
    -- 插入内容到表:
    INSERT INTO table_test VALUES('java','harry');
    INSERT INTO table_test VALUES('python','houder');
    
    -- 再查看
    SELECT * FROM table_test;

    删除数据库命令:

    drop database database_test; 

    三、添加非 root 级别用户:

    1.查看用户

    use mysql;
    select * from user;

    效果如上图,最后用数据库软件,因为在linux下界面看不清效果,太乱了。

    从上图可以看到,会列出数据库所有的用户及权限

    2.创建用户

    CREATE USER  'user_name'@'host'  IDENTIFIED BY  'password';

    user_name:要创建用户的名字。

    host:表示要这个新创建的用户允许从哪台机登陆,如果只允许从本机登陆,则 填 ‘localhost’ ,如果允许从远程登陆,则填 ‘%’

    password:新创建用户的登陆数据库密码,如果没密码可以不写。

    举例:我用以下命令创建新用户 user_test ,并允许外部连接,密码使用 password_test ,再用 select * from user;查看用户列表:

    CREATE USER  'user_test'@'%'  IDENTIFIED BY  'password_test';

     

    可以看出 有 user_test 用户了。但是可以看到 user_test 的权限很多都是 N,表示没有权限,因为还要为用户授予权限。

     3.授权用户

    普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利

    命令: 

    GRANT privileges ON  databasename.tablename  TO  'username'@'host';

    privileges:表示要授予什么权力,例如可以有 select , insert ,delete,update ,create,drop,alter 等,如果要授予全部权力,则填 ALL

    databasename.tablename:表示用户的权限能用在哪个库的哪个表中,如果想要用户的权限很作用于所有的数据库所有的表,则填 *.*,*是一个通配符,表示全部。

    ’username‘@‘host’:表示授权给哪个用户。

    例如:

    执行该语句,给用户 user_test 授权,让user_test能给 database_test 库中的 table_test 表 授予 insert 和 select 和 update 和 delete权限。

    GRANT  select,insert , update , delete  ON  database_test.table_test  TO 'user_test'@'%';

    或者:

    给用户 user_test 授权,让 user_test 能给所有库所有表实行所有的权力(强烈不建议)。

    GRANT  ALL  ON  *.*  TO  'user_test'@'%';

    或者:

    给用户 user_test 授权,让user_test能给 database_test 库中的所有表 授予insert 和 select 和 update 和 delete权限。

    GRANT  select,insert,update,delete  ON  database_test.*  TO 'user_test'@'%';

    效果:

    使用 user_test 账号连接数据库,只能查看到 database_test 数据库下的 table_test 数据表,table_test_1 数据表无法查看

    该用户有该表的增删改查权限

    grant 数据库开发人员,创建表、索引、视图、存储过程、函数等权限

    -- grant 创建、修改、删除 MySQL 数据表结构权限。
    
    grant create on database_test.* to 'user_test'@'%';
    
    grant alter on database_test.* to 'user_test'@'%';
    
    grant drop on database_test.* to 'user_test'@'%'; 
     
    -- grant 操作 MySQL 外键权限:
    
    grant references on database_test.* to 'user_test'@'%'; 
     
    
    -- grant 操作 MySQL 临时表权限:
    
    grant create temporary tables on database_test.* to 'user_test'@'%'; 
    
    -- grant 操作 MySQL 索引权限:
    
    grant index on database_test.* to 'user_test'@'%'; 
     
    -- grant 操作 MySQL 视图、查看视图源代码权限:
    
    grant create view on database_test.* to 'user_test'@'%';
    
    grant show view on database_test.* to 'user_test'@'%'; 
     
    --grant 操作 MySQL 存储过程、函数权限:
    
    grant create routine on database_test.* to 'user_test'@'%'; -- now, can show procedure status 
    
    grant alter routine on database_test.* to 'user_test'@'%'; -- now, you can drop a procedure 
    
    grant execute on database_test.* to 'user_test'@'%'; 

    grant DBA 管理 MySQL 中所有数据库的权限:

    grant all on *.* to 'user_test'@'localhost' 

    all:表示全部权限,包括select,update,drop.....

    *:第一个星号代表全部数据库,第二个星号代表全部的数据表

    user_test:是要授权的用户

    localhost:代表只允许本地连接,不允许外部连接

    这种有全部权限的用户不建议外部连接

    MySQL grant 权限,分别可以作用在多个层次上

    -- 这些都是上面公式的变形了
    
    
    -- grant 作用在整个 MySQL 服务器上:
    
    grant select on *.* to 'user_test'@'%'; -- 'user_test' 可以查询 MySQL 中所有数据库中的表。 
    
    grant all on *.* to 'user_test'@'%'; -- 'user_test' 可以管理 MySQL 中的所有数据库 
     
    
    -- grant 作用在单个数据库上:
    
    grant select on database_test.* to 'user_test'@'%'; -- 'user_test' 可以查询 database_test 中的表。
     
    
    -- grant 作用在单个数据表上:
    
    grant select, insert, update, delete on database_test.table_test to 'user_test'@'%'; 
    
    
    -- 这里在给一个用户授权多张表时,可以多次执行以上语句。例如:
    
    grant select(user_id,username) on database_test.table_test to 'database_test'@'%' identified by 'password_test';
    
    grant select on database_test.table_test to 'database_test'@'%' identified by 'password_test'; 
     
    
    -- grant 作用在表中的列上:
    
    grant select(name, author) on database_test.table_test to 'user_test'@'%'; 
    
    
    -- grant 作用在存储过程、函数上: 
    
    grant execute on procedure database_test.pr_add to 'user_test'@'%' 
    
    grant execute on function database_test.fn_add to 'user_test'@'%' 

    查看 MySQL 用户权限

    -- 查看当前用户(自己)权限:
    
    show grants; 
     
    
    -- 查看其他 MySQL 用户权限:
    
    show grants for 'user_test'@'%'; 

    撤销已经赋予给 MySQL 用户权限的权限。

    revoke 跟 grant 的语法差不多,只需要把关键字 “to” 换成 “from” 即可:

    grant all on *.* to 'user_test'@'%';
    
    revoke all on *.* from 'user_test'@'%'; 

    注意 on 之后的条件很重要,赋权时用的什么,回收权限也要和这个一致

    例如:

    GRANT  select,insert  ON  *.*  TO 'user_test'@'%';
    REVOKE  insert ON   database_test.table_test  from  'user_test'@'%'; -- 回收不了权限,提示错误
    REVOKE  insert ON   *.*  from  'user_test'@'%';

    4.设置与更改用户密码

    SET  PASSWORD  FOR  'username'@'host' = PASSWORD('newpassword');

    如果是设置用户的密码:

    如:

    SET  PASSWORD  FOR  'user_test'@'host' = PASSWORD('newpassword_test');

    5.删除用户

    命令:

    DROP  USER 'user_name'@'host'; 

    例:

    使用 root 账号登录,执行命令删除用户 user_test ;

    DROP USER 'user_test'@'%';

    6.撤销用户权限:

    命令:

    REVOKE privileges ON database.tablename  FROM  'username'@'host';

    例如: 

    REVOKE  SELECT ON  *.*  FROM  'user_test'@'%'

    注意:

    GRANT  select,insert  ON  *.*  TO 'user_test'@'%';
    REVOKE  insert ON   database_test.table_test  from  'user_test'@'%'; -- 回收不了权限,提示错误
    REVOKE  insert ON   *.*  from  'user_test'@'%';

    若授予权利是这样写: 

    GRANT  select,insert  ON  *.*  TO 'user_test'@'%';

    则用

    REVOKE  insert ON   database_test.table_test  from  'user_test'@'%'; 

    是不能撤销用户 user_test  对 database_test.table_test 中的 insert 权利的。


    反过来:

    若授予权利是这样写: 

    grant insert on database_test.table_test to 'user_test'@'%';

    则用

    grant insert on *.* to 'user_test'@'%';

    也是不能用来撤销用户 user_test 对 database_test 库的 table_test 表的 insert 权利的

     

    补充:

    mysql授权表共有5个表:user、db、host、tables_priv和columns_priv。

    授权表的内容有如下用途:
    user表
    user表列出可以连接服务器的用户及其口令,并且它指定他们有哪种全局(超级用户)权限。在user表启用的任何权限均是全局权限,并适用于所有数据库。例如,如果你启用了DELETE权限,在这里列出的用户可以从任何表中删除记录,所以在你这样做之前要认真考虑。

    db表
    db表列出数据库,而用户有权限访问它们。在这里指定的权限适用于一个数据库中的所有表。

    host表
    host表与db表结合使用在一个较好层次上控制特定主机对数据库的访问权限,这可能比单独使用db好些。这个表不受GRANT和REVOKE语句的影响,所以,你可能发觉你根本不是用它。

    tables_priv表
    tables_priv表指定表级权限,在这里指定的一个权限适用于一个表的所有列。

    columns_priv表
    columns_priv表指定列级权限。这里指定的权限适用于一个表的特定列

      

    总结:(理解原理)

      使用grant授权实质是在mysql数据库的user表中增加一列,收回权限实质是从表中删除一列。所以授权也可以替换为删除表数据来代替,授权收权实质是操作mysql的user表。

  • 相关阅读:
    只能输入正整数 以及常用的正则表达式 (转载)
    SVN cleanup操作反复失败解决办法 (转载)
    关于${pageContext.request.contextPath}的理解 (转载)
    Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds
    一则Oracle EXP导出报错的解决办法(转载)
    js数组的sort排序详解(转载)
    JavaScript arguments对象(转载)
    转 :meta name的含义
    一些小问题
    005.JMS可靠性机制
  • 原文地址:https://www.cnblogs.com/lzghyh/p/14511350.html
Copyright © 2020-2023  润新知