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 初始化
  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

 

posted @ 2024-09-19 09:12  jevan  阅读(4)  评论(0编辑  收藏  举报