linux下怎样实现mysql的数据备份及误删除恢复
安装目录结构
数据库目录:/var/lib/mysql/
配置文件:/usr/share/mysql(mysql.server命令及配置文件)
相关命令:/usr/bin(mysqladmin、mysqldump等命令)(*mysql的一种安全启动方式:/usr/bin/mysqld_safe --user=root &)
2017-05-03T17:14:56.155066Z 0 [ERROR] InnoDB: .\ibdata1 must be writable
2017-05-03T17:14:56.155066Z 0 [ERROR] InnoDB: The system tablespace must be writable
2017-05-03T17:14:56.375466Z 0 [ERROR] Plugin 'InnoDB' init function returned error.
2017-05-03T17:14:56.375466Z 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2017-05-03T17:14:56.375466Z 0 [ERROR] Unknown/unsupported storage engine: InnoDB
2017-05-03T17:14:56.375466Z 0 [ERROR] Aborting
---------------------
MYSQL没有权限写入.\ibdata1文件,使用管理者取得该文件的权限后也没有效果,偶然看到有位大佬的修改方法:
解决方法:
1、打开任务管理器终止mysqld进程;
2、打开mysql安装目录的data文件夹,删除以下2个文件:ib_logfile0和ib_logfile1
3、重新启动mysql
原因分析
MySQL 文件结构
MySQL文件包括MySQL所建数据库文件和MySQL所用引擎创建的数据库文件。
.frm 文件与操作系统和数据库引擎无关,都有这么个与表名同名文件。
MyISAM引擎的文件:
.myd 即 my data,表数据文件
.myi 即my index,索引文件
.log 日志文件。
InnoDB引擎的文件:
采用表空间(tablespace)来管理数据,存储表数据和索引,
InnoDB数据库文件(即InnoDB文件集,ib-file set):
ibdata1、ibdata2等:系统表空间文件,存储InnoDB系统信息和用户数据库表数据和索引,所有表共用。
.ibd文件:单表表空间文件,每个表使用一个表空间文件(file per table),存放用户数据库表数据和索引。
Redo日志文件: ib_logfile0、ib_logfile1
---------------------
InnoDB 在启动时需要配置LOG File的目录,如果没有制定目录,则会在MySQL Data目录下创建2个日志文件ib_logfile0 and ib_logfile1,在创建的时候需要确保MYSQL拥有对该目录的权限。
方案解释
原来的文件不是MYSQL生成,MYSQL 没有相应的权限,但是删除后,后来MYSQL自己新建的文件,能够保持权限???需要验证
---------------------
[root@localhost mysql]# service mysqld start
Starting mysqld: [ OK ]
连接数据库:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
service mysqld stop
Go to mysql/bin directory(到该目录下)
$ cd /usr/bin
Start a mysql deamon with this option:
$ sudo mysqld_safe --skip-grant-tables
Open another terminal and open a mysql session to execute this: (再开启一个terminal : 快捷键 command + t)
$ mysql
mysql> use mysql;
see Note1 below for next line.
mysql> UPDATE user SET authentication_string=PASSWORD('YOUR_NEW_PASSWORD_HERE') WHERE user = 'root'; //蓝色的就是你要输入的新密码
# mysql -u root mysql
mysql> delete from user where USER='';
mysql> FLUSH PRIVILEGES; //记得要这句话,否则如果关闭先前的终端,又会出现原来的错误
mysql> \q
mysql> exit;
Now kill the mysqld_safe process and restart mysqld normally:
$ service mysqld start
执行
mysql> show variables;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
执行如下就能解决:
mysql> alter user 'root'@localhost identified by 'root';
Query OK, 0 rows affected (0.00 sec)
查阅资料后才知道,原来是Password Expiration Policy搞的鬼,自从5.7.4版本后就有了这么一个东西(详情参考最后的参考网站)。