记一次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 --initialize-insecure 无密码初始化)
执行后无任何提示即为正常;
自动在 MySQL 根目录生成data文件夹;
进入 data,打开后缀.err日志文件,搜索 root@localhost: 后面一串字符就是初始临时密码,复制保存好 - 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
创建用户
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;
本文来自博客园,作者:jevan,转载请注明原文链接:https://www.cnblogs.com/DoNetCShap/p/18419766

浙公网安备 33010602011771号