记一次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 表示跳过密码验证
配置环境变量
执行以下命令
- mysqld --initialize 初始化
- mysqld --remove 从Windows 服务管理器中移除
- mysqld -install 添加到Windows 服务管理器
修改mysql密码
输入连接命令(目前root的密码是空,输入回车后,再直接回车就行):
mysql -uroot -p
结果如下,进入了mysql命令连接模式
执行以下命令
-
flush privileges(刷新)
-
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的密码'(修改密码)
-
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后,不能用双引号来引用字符串,因为它被解释为识别符
解决办法
- 去掉 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
本文来自博客园,作者:jevan,转载请注明原文链接:https://www.cnblogs.com/DoNetCShap/p/18419766