分类 MySql 下的文章

linux下mysql8.0重置密码的方法
过程是先设置无密码登录, 把root的密码设为空字符, 在取消无密码登录, 再登录root, 再执行重置密码动作
无密码登录mysql
systemctl set-environment MYSQLD_OPTS="--skip-grant-tables";
systemctl restart mysqld
mysql 回车即可
update mysql.user set authentication_string=''  where User='root';
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Abc123456!';

出现了一个诡异的问题, 在SQLyog中执行mysql连接是出现2058错误, 后面还有错误文字编码, 这个是由于加密方式导致的, SQLyog不支持mysql8的用户的默认加密方式

但是在一个开源的mysql工具中正常

解决方法:在命令行下登录 mysql -u root -p 登录你的 mysql 数据库然后 执行这条SQL

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

然后我在用SQLyog中再执行登录就正常了

先理解下概念

dockerfile用途是用于执行build生成镜像分支, 在依据这个镜像分支去运行多个镜像

下面以mysql举例

1. 拉取mysql镜像
docker pull mysql
2. 查看mysql
docker images |grep mysql
3.查看本地镜像: (参数-a 表示所有)
docker images -a 
  • 先创建一个Dockerfile文件
FROM mysql
EXPOSE 3306
ENV MYSQL_ROOT_PASSWORD 12345
  • 执行build命令
# 注意最后一个.不能少, 这个表示当前路径
[root@localhost mysql]# docker build -t mysql2:Dockerfile .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM mysql
 ---> be0dbf01a0f3
Step 2/3 : EXPOSE 3306
 ---> Running in 8f2ae74e3aae
Removing intermediate container 8f2ae74e3aae
 ---> 2a6324549f86
Step 3/3 : ENV MYSQL_ROOT_PASSWORD 12345
 ---> Running in 1c61b6fd498b
Removing intermediate container 1c61b6fd498b
 ---> ec33c8026d5c
Successfully built ec33c8026d5c
Successfully tagged mysql2:Dockerfile
  • 查询当前镜像, 这个mysql2就是以我们的配置构建的镜像分支
[root@localhost mysql]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
mysql2              Dockerfile          ec33c8026d5c        About a minute ago   541MB
mysql               latest              be0dbf01a0f3        3 weeks ago          541MB
  • 执行容器
docker run -p 3306:3306 --name my_mysql2 -e -d mysql2:Dockerfile --default-authentication-plugin=mysql_native_password

说明: --default-authentication-plugin=mysql_native_password 
这个配置的添加是为了保证启动好的mysql能通过sqlyog访问, 使用使用兼容的加密方式

这个方案并不好, 很傻, 主要是为了帮助理解dockerfile的简单的使用示例用途

添加用户

1. 允许本地访问的用户(127.0.0.1)
create user test1@localhost identified by '123456';  
2. 允许外网IP访问的用户
create user 'test1'@'%' identified by '123456'; 

用户分配权限

授予用户在本地服务器对该数据库的全部权限
grant all privileges on dbname.* to test1@localhost;
授予用户通过外网IP对于该数据库的全部权限
grant all privileges on dbname.* to 'test1'@'%';  
刷新权限
flush privileges; 

查询用户的权限

mysql> show grants for test1;
+---------------------------------------------------+
| Grants for test1@%                                |
+---------------------------------------------------+
| GRANT USAGE ON *.* TO `test1`@`%`                 |
| GRANT ALL PRIVILEGES ON `MyDB`.* TO `test1`@`%`   |
| GRANT ALL PRIVILEGES ON `common`.* TO `test1`@`%` |
| GRANT ALL PRIVILEGES ON `course`.* TO `test1`@`%` |
| GRANT ALL PRIVILEGES ON `dbname`.* TO `test1`@`%` |
+---------------------------------------------------+
5 rows in set (0.00 sec)

给用户全部权限

mysql> grant all privileges on *.* to 'test1'@'%' ;
Query OK, 0 rows affected (0.04 sec)

撤销用户的全部授权

mysql> revoke all privileges on *.* from 'test1'@'%' ;
Query OK, 0 rows affected (0.09 sec)
(上述权限移除, 如果登录的用户没有重新的登录, 原有的权限不会丢失, 刷新权限也没有用, 这个权限必须重新登录才见到效果)

仅仅给用户某个数据库的查询权限

mysql> grant select on common.* to 'test1'@'%';
Query OK, 0 rows affected (0.04 sec)
mysql> show grants for test1;

+-------------------------------------------+
| Grants for test1@%                        |
+-------------------------------------------+
| GRANT USAGE ON *.* TO `test1`@`%`         |
| GRANT SELECT ON `common`.* TO `test1`@`%` |
+-------------------------------------------+
2 rows in set (0.00 sec)

PDOException: SQLSTATE[HY000] [2002] No such file or directory
找到相应的.sock文件,并设置php.ini文件中的pdo_mysql.default_socket的值为.sock文件的路径。
[root@localhost src]# cat /etc/my.cnf
找到配置 socket      = /tmp/mysql.sock


[root@localhost ~]# whereis php
php: /usr/bin/php /usr/lib64/php /etc/php.ini /etc/php.d /usr/local/php /usr/share/php /usr/share/man/man1/php.1.gz
[root@localhost ~]# vim /etc/php.ini
>/pdo_mysql.default_socket # 搜索这段参数的位置

pdo_mysql.default_socket= /tmp/mysql.sock #注意有的配置为 /tmp/mysqld.sock 根据前面查到的配置来
[root@localhost ~]# service php-fpm restart