Loading

记一次Mysql5.7安装及通过ibd和frm文件恢复数据库数据

 下载官方压缩包: 链接

解压到任意目录

在目录中新建一个配置文件

[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8

[mysqld]
# 端口3306
port=3306
# 设置mysql的安装目录
basedir=D:\mysql-5.7.44-winx64
# 设置mysql数据库的数据存放目录
datadir=E:\MySqlData

#secure-file-priv="E:\MySqlData\Uploads"
# 允许最大连接数
max_connections=2000
# 幅度按使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时使用的默认存储引擎
default-storage-engine=INNODB
# 跳过密码检测
# skip-grant-tables

注意:修改路径为自己的MySQL的所在位置

basedir 解压的目录
datadir 数据目录 (data文件夹不需要自己建,会自动生成)
skip-grant-tables 表示跳过密码验证

配置环境变量

 

 

 

执行以下命令

  1. mysqld --initialize 初始化(mysqld --initialize-insecure 无密码初始化)

    执行后无任何提示即为正常;
    自动在 MySQL 根目录生成data文件夹;
    进入 data,打开后缀.err日志文件,搜索 root@localhost: 后面一串字符就是初始临时密码,复制保存好

  2. mysqld --remove 从Windows 服务管理器中移除
  3. mysqld -install 添加到Windows 服务管理器

修改mysql密码

输入连接命令(目前root的密码是空,输入回车后,再直接回车就行):

mysql -uroot -p

结果如下,进入了mysql命令连接模式

 

执行以下命令

  1. flush privileges(刷新)

  2. ALTER USER 'root'@'localhost' IDENTIFIED BY '你的密码'(修改密码)

  3. flush privileges(再次刷新)

exit退出mysql

把my.ini文件的skip-grant-tables 注释掉

 

关于只能连接localhost的问题

在MySQL所在服务器上使用命令登录到MySQL数据库中

mysql -u root -p

选择mysql数据库,并查询权限

use mysql;

select host from user where user='root';

 

可以看到,执行查询语句后得到的数据结果中 host 的值是 localhost

我们执行update语句修改权限

update user set host = '%' where user ='root';

 刷新配置,再次执行查询权限语句

flush privileges;

select host from user where user='root';

 

 

可以看到,已经修改成功

4、最后再次用其他机器连接MySQL数据库,可以连接成功

 

 

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

MySQL 服务无法启动,服务没有报告任何错误--一种解决方案

输入命令启动mysql,发现

 输入如下命令查看错误信息

mysqld --console

显示端口号被占用

 输入如下命令查看占用端口号3306的进程

netstat -aon|findstr "3306"

显示占用3306的进程id

 输入如下命令查看进程名

tasklist|findstr "9372"

显示id为9372的进程名

打开任务管理器,结束该进程

启动mysql,服务启动成功

 

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

由于本地服务器中原来安装的是Mysql5.7,服务器挂了,硬盘拆了组了个新的十八手机。运行进来Mysql运行不起来,以上步骤都是重新安装Mysql时遇上的。

服务进来了,可数据没了,一顿鼓捣,最终恢复出了自己想要的
前提原始数据库文件都正常存在

停止Mysql服务,从原先数据库的数据目录中拷贝对应的库文件(是个目录,目录中有.frm及.ibd文件),到新的数据库目录中,然后把数据根目录中ibdata1(此文件是数据内容)文件也拷贝过来

再启动Mysql服务,会发现,数据恢复了

 

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

简单命令备份

1、显示当前数据库服务器中的数据库列表:

mysql> SHOW DATABASES;

注意:mysql库里面有MYSQL的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。

2、显示数据库中的数据表:

mysql> USE 库名;
mysql> SHOW TABLES;

3、显示数据表的结构:

mysql> DESCRIBE 表名;

4、建立数据库:

mysql> CREATE DATABASE 库名;

5、建立数据表:

mysql> USE 库名;
mysql> CREATE TABLE 表名 (字段名 VARCHAR(20), 字段名 CHAR(1));

6、删除数据库:

mysql> DROP DATABASE 库名;

7、删除数据表:

mysql> DROP TABLE 表名;

8、将表中记录清空:

mysql> DELETE FROM 表名;

9、显示表中的记录:

mysql> SELECT * FROM 表名;

10、往表中插入记录:

mysql> INSERT INTO 表名 VALUES (”hyq”,”M”);

11、更新表中数据:

mysql-> UPDATE 表名 SET 字段名1='a',字段名2='b' WHERE 字段名3='c';

12、用文本方式将数据装入数据表中:

mysql> LOAD DATA LOCAL INFILE “D:/mysql.txt” INTO TABLE 表名;

13、导入.sql文件命令:

mysql> USE 数据库名;
mysql> SOURCE d:/mysql.;

14、命令行修改root密码:

mysql> UPDATE mysql.user SET password=PASSWORD('新密码') WHERE User='root';
mysql> FLUSH PRIVILEGES;

15、显示use的名:

mysql> SELECT DATABASE();

16、显示当前的user:

> SELECT USER();

 

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

在后面使用过程中出现的问题

which is not functionally dependent on columns in GROUP BY clause;  

查询时的ONLY_FULL_GROUP_BY错误

查询语句执行时显示 sql_mode=only_full_group_by 问题

sql_mode 配置解析

ONLY_FULL_GROUP_BY

对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中。简而言之,就是SELECT后面接的列必须被GROUP BY后面接的列所包含。如:
select a,b from table group by a,b,c; (正确)
select a,b,c from table group by a,b; (错误)
这个配置会使得GROUP BY语句环境变得十分狭窄,所以一般都不加这个配置

NO_AUTO_VALUE_ON_ZERO

该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。(不信的可以试试,默认的sql_mode你在自增主键列设置为0,该字段会自动变为最新的自增值,效果和null一样),如果用户希望插入的值为0(不改变),该列又是自增长的,那么这个选项就有用了。

STRICT_TRANS_TABLES

在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制。(InnoDB默认事务表,MyISAM默认非事务表;MySQL事务表支持将批处理当做一个完整的任务统一提交或回滚,即对包含在事务中的多条语句要么全执行,要么全部不执行。非事务表则不支持此种操作,批处理中的语句如果遇到错误,在错误前的语句执行成功,之后的则不执行;MySQL事务表有表锁与行锁非事务表则只有表锁)

NO_ZERO_IN_DATE

在严格模式下,不允许日期和月份为零

NO_ZERO_DATE

设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告。

ERROR_FOR_DIVISION_BY_ZERO

在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如 果未给出该模式,那么数据被零除时MySQL返回NULL

NO_AUTO_CREATE_USER

禁止GRANT创建密码为空的用户

NO_ENGINE_SUBSTITUTION

如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常

PIPES_AS_CONCAT

将”||”视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似

ANSI_QUOTES

启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符

解决办法

  1. 去掉 ONLY_FULL_GROUP_BY,重新设置值。
set @@sql_mode 
='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

上面是改变了全局sql_mode,对于新建的数据库有效。对于已存在的数据库,则需要在对应的数据库下执行:

set @@sql_mode 
='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

或者:
在 my.cnf 里面设置:

[mysqld]
sql_mode=’STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION’
这个需要重启mysql服务!

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

mysql 调用 SSPI 失败

在数据库连接字符串中添加

SSL Mode=None

 
创建用户

1、使用 root 管理员登陆 mysql
mysql -uroot -p;
2、创建新用户
CREATE USER 'CPSAdmin'@'%' IDENTIFIED BY 'CPSAdmin123''%' - 所有情况都能访问
‘localhost’ - 本机才能访问
’111.222.33.44‘ - 指定 ip 才能访问
3、给该用户添加权限
grant all privileges on gps_data.* to 'CPSAdmin'@'%';
grant all privileges on gps_hisData.* to 'CPSAdmin'@'%';
all 可以替换为 select,delete,update,create,drop
4、删除用户
Delete FROM mysql.user Where User='user1';
四、可能遇到的问题
flush privileges;
在操作 mysql 库做用户的增删修改的时候,操作完毕的时候最好使用 flush privilege 命令刷新一下权限。否则可能会修改不生效

 

打开cmd,切换至 E:\xampp\mysql\bin,用 root 账户连接MySQL服务器:

mysql -uroot -p -P3306

首先,创建新用户:

create user 'user01'@'127.0.0.1' identified by '666666';
 
create user 'user01'@'%' identified by '666666';

说明:@后面的ip地址为允许连接的客户端的ip地址,如果改为 '%',就表示客户端没有ip地址的限制。

然后,给新用户授权:

示例:

grant all privileges on *.* to 'user01'@'127.0.0.1' identified by '666666';
# 赋予新用户,从本地操作所有数据库.所有数据表的所有权限
 
grant all privileges on *.* to 'user01'@'%' identified by '666666';
# 赋予新用户,从外部操作所有数据库.所有数据表的所有权限(没有外部客户端的IP限制,但本地有限制)

最后,刷新权限,使权限立即生效:

FLUSH PRIVILEGES;
# 刷新权限(有时很必要)

注意事项:

创建用户时,如果后面是@'127.0.0.1',则只能从本地连接。
创建用户时,如果后面是@'%',就可以从外部(局域网或外网)连接;而且还可以从本地连接,且没有密码。
创建用户后,该用户就可以连接MySQL了,但默认什么权限都没有,想要操作数据库,就必须进行授权。
创建用户时,实际上是在mysql.user表中添加一条记录,Host(客户端地址)和User(用户名)共同确定记录的唯一性。
授权时,如果对应的记录(客户端地址和用户名)已经存在,就更新该记录;否则,会添加一条记录。
创建用户和授权,实际上都是操作mysql.user表。
综上所述,如果想给某个不存在的用户赋予数据库操作权限,只需一条授权命令即可。

grant all privileges on *.* to 'test'@'%' identified by '666666';
# 只执行这条授权命令,会在授权的同时,创建test用户。
# test用户,可以从外部连接MySQL(需要输入密码),具备所有权限。
# test用户,也可以从本地连接MySQL(不能输入密码),只能连接,不具备数据库操作权限。
 
# 如果想让test用户,在本地也具备所有权限,且用同样的密码,再授权一次即可。如下:
grant all privileges on *.* to 'test'@'127.0.0.1' identified by '666666';
一键获取完整项目代码
也就是说,如果想给某个不存在的用户,授予所有数据库操作权限,且不论从本地还是外部连接,都具有同样的权限,且密码相同。只需执行下面两条授权命令:

grant all privileges on *.* to 'test'@'%' identified by '666666';
 
grant all privileges on *.* to 'test'@'127.0.0.1' identified by '666666';

删除用户:

DROP USER user01@%;
DROP USER user01@127.0.0.1;

 



posted @ 2024-09-19 09:12  jevan  阅读(691)  评论(1)    收藏  举报