在MySQL数据库管理过程中,由于各种原因可能会导致数据的丢失或者损坏,这就需要我们学会和掌握恢复数据的方法。MySQL数据库提供了多种恢复数据的方式,本篇文章将针对这些恢复数据的方式进行讲解。
1. 通过备份来恢复数据
在生产环境中,管理员通常会定期进行数据库备份,以便在数据丢失或者损坏时可以快速恢复到之前的状态。备份可以通过命令行或者图形化工具来执行,下面介绍两种备份的方法。
1.1 命令行备份
使用mysqldump命令行工具进行备份。假设我们要备份一个名为test的数据库,在命令行中输入以下命令:
“`
$ mysqldump -u root -p test > test_backup.sql
“`
此命令将把test的数据库备份到test_backup.sql文件中。恢复备份可以使用以下命令:
“`
$ mysql -u root -p test
“`
此命令将备份文件中的数据恢复到test数据库中。
1.2 图形化备份
图形化工具通常包括导出、备份等功能,下面以phpMyAdmin为例进行备份。在数据库列表中选定相应的数据库,选择导出选项,选择所要导出的表格并设定导出方式为.sql,最后点击开始即可备份数据库。导入相似,进入导入页面后选择已备份的.sql文件即可开始还原数据。
2. 利用二进制日志进行数据恢复
MySQL提供了二进制日志(binlog)来记录所有对MySQL数据库进行的更改,管理员可以利用这个日志记录来恢复数据。下面介绍利用二进制日志进行数据恢复的方法。
2.1 开启二进制日志
在MySQL数据库配置文件my.cnf中添加以下配置:
“`
log-bin=mysql-bin
“`
保存并关闭文件后,重启MySQL服务即可。
2.2 恢复数据
假设我们的数据库中发生了一些意外的更改导致了数据丢失,我们可以通过以下步骤进行数据恢复:
1. 查看二进制日志文件
查看二进制日志文件名,在命令行中输入以下命令:
“`
$ ls /var/log/mysql/
“`
2. 使用mysqlbinlog查看日志文件内容
在命令行中输入以下命令:
“`
$ mysqlbinlog /var/log/mysql/mysql-bin.000001
“`
此命令将显示二进制日志文件的内容。管理员可以手动查找到操作前的状态并执行其相反的操作来恢复数据。
3. 把找到的还原日志文件应用到服务器
在命令行中输入以下命令:
“`
$ mysqlbinlog /var/log/mysql/mysql-bin.000001 | mysql -u root -p
“`
此命令将把找到的还原日志文件应用到服务器上,将会还原指定时间点之前的状态。
3. 利用本地备份进行数据恢复
当数据库出现不可恢复的错误时,我们可以尝试利用本地备份文件进行数据恢复。下面介绍利用本地备份进行数据恢复的方法。
3.1 使用mysqldump备份数据
执行以下命令备份对应数据库:
“`
$ mysqldump -u root -p test > test_backup.sql
“`
备份成功后,将test_backup.sql文件保存到本地。
3.2 清空数据表
在恢复数据前,需要将数据库中数据表清空,执行以下命令:
“`
$ mysql -u root -p
mysql> USE test;
mysql> SET FOREIGN_KEY_CHECKS=0;
mysql> TRUNCATE table1, table2, table3;
mysql> SET FOREIGN_KEY_CHECKS=1;
mysql> quit;
“`
3.3 恢复数据
进入恢复命令行模式后,将备份文件恢复到对应的数据库中,执行以下命令:
“`
$ mysql -u root -p test
“`
以上即为本文介绍的,希望对大家在MySQL数据恢复过程中有所帮助。同时也提醒各位管理员,一定要及时备份数据以便在数据丢失或者损坏时可以快速恢复。
相关问题拓展阅读:
- mysql 数据备份
- linux 备份的数据库怎么恢复
mysql 数据备份
使用直接拷贝的方法备份时,尤其要注意表没有被使用,应该对表进行读锁定或停止MySQL服务。备份一个表,需要三个文件:
对于MyISAM表:
tbl_name.frm 表的描述文件
tbl_name.MYD 表的数据文件
tbl_name.MYI 表的索引文件
对于ISAM表:
tbl_name.frm 表的描述文件
tbl_name.ISD 表的数据文件
tbl_name.I 表的索引文件
对于MyISAM表,你可以从运行在不同硬件系统的服务器之间复制文件,例如,SUN服务器和INTEL PC机之间。
当 然,这只是备份一个数据表,在很多情况下我们需要备份完整的数据库,这个时候同样可以直接复制数据库文件夹即可完成备份;若想再省点儿事,把整个数据库目 录“data”复制也可以,但是在还原数据时要注意,只能一个一个地还原数据库,因为该目录下有mysql运行时的配置文件,若正在运行的mysql配置 信息遭到还原破坏,整个mysql服务就会无法启动。
SELECT INTO OUTFILE和MYSQLDUMP备份数据:
MySQLdump工具可以把整个数据库装载到一个单独的文本文件中。这个文件包含所有重建数据库和表的SQL命令。这个命令取得所有的模式 (Schema)并且将其转换成DDL语法(CREATE语句,即数据库定义语句),还取得所有的数据,并且为这些数据创建INSERT语句。所有的东西 都被包含到了一个文本文件中。这个文本文件可以用一个简单的批处理和一个合适SQL语句导回到MySQL中。这个工具令人难以置信地简单而快速。
有3种方式来调用mysqldump
选择一个数据库或一个数据表备份猛乱汪到一个文件:
/bin> mysqldump db_name > filename.txt
选择多个数据库备份到一个文件:
/bin> mysqldump –database DB1 > filename.txt
所有数据库备份到一个文件:
/bin> mysqldump –all–database > filename.txt
Option选择:
–help,-?
显示帮助消息并退出。
–add-drop-table
这个选项将会在每一个表的前面加上DROP TABLE IF EXISTS语句,这样可以保证导回MySQL数据库的时候不会出错,因为每次导回的时候,都会首先检查表是否存在,存在就删除
–add-locks
这个选项会在INSERT语句中捆上一个LOCK TABLE和UNLOCK TABLE语句。这就防止在这些记录被再次导入数据库时其他用户对表进行的操作
-c or –complete_insert
这个选项使得MySQLdump命令给每一个产生INSERT语句加上陪信列(field)的名字。当把数据导出导另外一个数据库时这个选项很有用。
–delayed-insert 在INSERT命令中加入DELAY选项
-F or –flush-logs 使用这个选项,在执行导出之前将会刷新MySQL服务器的log.
-f or –force 使用这个选项,即使有错误发生,仍然继续导出
–full 这个选项把附加信息也加到CREATE TABLE的语句中
-l or –lock-tables 使用这个选项,导出表的时候服务器将会给表加锁。
-t or –no-create- info
这个选项使的MySQLdump命令不创建CREATE TABLE语句,这个选项在您只需要数据而不需要DDL(数据库定义语句)时很方便。
-d or –no-data 这个选项使的MySQLdump命令不创建INSERT语枝仔句。
在您只需要DDL语句时,可以使用这个选项。
–opt 此选项将打开所有会提高文件导出速度和创造一个可以更快导入的文件的选项。
-q or –quick 这个选项使得MySQL不会把整个导出的内容读入内存再执行导出,而是在读到的时候就写入导文件中。
-T path or –tab = path
这 个选项将会将数据库中每一个表创建两个文件,一个文件包含DDL语句或者表创建语句,另一个文件包含数据。DDL文件被命名为 table_name.sql,数据文件被命名为table_name.txt。该参数的path为存放目录,而且该目录必须已经存在。 如:/bin>mysqldump –uroot –p –tab=d:\\ mydata
-w “WHERE Clause” or –where = “Where clause ” 筛选将要放到导出文件的数据。
下面来看几组mysqldump命令案例:
将数据库mydata的内容备份到mydata.txt文件中:
/bin>MySQLdump –uroot -p mydata > d:\\mydata.txt
将mydata数据库中的users表的内容备份到d:\\users.txt:
/bin>MySQLdump –uroot -p mydata users > d:\\users.txt
将mydata数据库中的users表username值为“feihu”的数据备份到d:\\users.txt:
/bin>MySQLdump –uroot -p –where=”username=’feihu’” mydata users > d:\\users.txt;
将mydata数据库以及内部表的创建结构(DDL)备份到d:\\users.txt:
/bin>MySQLdump –uroot –p -d mydata > d:\\mydata.txt
将mydata和mydata2数据库同时备份到d:\\users.txt:
/bin> MySQLdump –uroot –p -d mydata mydata2 > d:\\mydata.txt
将所有数据备份到一个数据库,命令怎么写呢???
schema: 模式The set of statements, expressed in data definition language, that completely describe the structure of a data base.(一组以数据定义语言来表达的语句集,该语句集完整地描述了数据库的结构。)
当需要将还原备份数据时,使用如下语句:
/bin>mysql –uroot –p mydata source d:\mydata.txt;
LOAD DATA INFILE和MYSQLIMPORT恢复数据
关于load data infile语句的使用已经在别一节讲述过了,详细请参考“使用LOAD DATA和INSERT语句导入Mysql数据”。如果你仅仅恢复数据, mysqlimport完全是与LOAD DATA 语句对应的,读者可以任意选择一个去实现。
MySQLimport位于MySQL/bin目录中,是MySQL的一个载入(或者说导入)数据的一个非常有效的工具。这是一个命令行工具。有两个参数 以及大量的选项可供选择。这个工具把一个文本文件(textfile)导入到你指定的数据库和表中。比方说我们要从文件users.txt中把数据导入到 数据库mydata中的表users中:
/bin>mysqlimport –uroot –p mydata d:\users.txt
注意:这里users.txt是我们要导入数据的文本文件,而mydata是我们要操作的数据库,数据库中的表名是users,这里文本文件的数据格式必须与users表中的记录格式一致,否则MySQLimport命令将会出错。
其中表的名字是导入文件的之一个句号(.)前面文件字符串,另外一个例子:MySQLimport mydata users.2023.10.txt; 那么我们将把文件中的内容导入到数据库mydata 中的users表中。
上面的例子中,都只用到两个参数,并没有用到更多的选项,下面介绍MySQLimport的选项
-d or –delete 新数据导入数据表中之前删除数据数据表中的所有信息
-f or –force 不管是否遇到错误,MySQLimport将强制继续插入数据
-i or –ignore MySQLimport跳过或者忽略那些有相同唯一关键字的行, 导入文件中的数据将被忽略。
-l or -lock-tables 数据入之前锁住表,这样就防止了,你在更新数据库时,用户的查询和更新受到影响。
-r or -replace 这个选项与-i选项的作用相反;此选项将替代表中有相同唯一关键字的记录。
–fields-enclosed-by= char 指定文本文件中数据的记录时以什么括起的, 很多情况下数据以双引号括起。 默认的情况下数据是没有被字符括起的。
–fields-terminated-by=char 指定各个数据的值之间的分隔符,在句号分隔的文件中,分隔符是句号。您可以用此选项指定数据之间的分隔符。默认的分隔符是跳格符(Tab)
–lines-terminated-by=str 此选项指定文本文件中行与行之间数据的分隔字符串或者字符。 默认的情况下MySQLimport以newline为行分隔符。您可以选择用一个字符串来替代一个单个的字符:一个新行或者一个回车。
MySQLimport命令常用的选项还有-v 显示版本(version),-p 提示输入密码(password)等。
如果,我们要导入一个文件(Orders.txt)中行的记录格式是这样的:
“1”, “ORD89876”, “1 Dozen Roses”, “”
我们的任务是要把这个文件里面的数据导入到数据库mydata中的表格Orders中,我们使用这个命令:
/Bin>MySQLimport -uroot–prl –fields-enclosed-by=” –fields-terminated-by=, mydata Orders.txt
比如我们要插入一些数据,使用包含下面文本的文件(文件名为New_Data.sql,当然我们也可以取名为New_Data.txt及任何其他的合法名字,并不一定要以后缀sql结尾):
USE mydata; INSERT INTO Orders (Orders_ID, username) VALUES(1, “Block”); INSERT INTO Orders (Orders_ID, username) VALUES(2, “Newton”); INSERT INTO Orders (Orders_ID, username) VALUES(3, “Simmons”);
注意上面的这些句子的语法都必须是正确的,并且每个句子以分号结束。上面的USE命令选择数据库,INSERT命令插入数据。
然后运行下面的命令:
/bin>mysql –uroot –p mydata
接着按提示输入密码,如果上面的文件中的语句没有错误,那么这些数据就被导入到了数据库中。
方法一:如果使用的是虚拟主机,可以用使用phpmyadmin来备份数据库。
1)登陆phpmyadmin。登陆后左边会出现数据库列表,单击要备份的数据库,如图。
2)在弹出的页面中,右侧上部单击“导出”按钮,一般保持默认选项,最下面“另存为文件”,选择“ZIP压缩”,最后单击执行按钮,如图
3)弹出保存文件后,保存文件即可,如图。
方法二:如果数据库可以使用外部链接。可以使用SQLyogEnt来备份。
1)打开SQLyogEnt,并登陆mysql服务器,前面的文章已经讲过,如果还不明白的可以看这里《MySql管理利器SQLyogEnt初识(php建立数据库)》。
2)在左边数据库菜单选择要备份的书库,然后右击它。在弹出的菜谈昌陵单中,选择Backup Database as sql dump,如图。
3)在弹出的对话框中,“export to file”即时备份数据迅型库文件含戚要保存的位置,其他保持默认选项,单击“Export”按钮,开始备份。如图。
如果数据库是存放在和程序一台服务器的时候,及数据库地址为localhost的时候,备份mysql数据库一般采用之一种方法,如果mysql数据库可以外部登录,就可以使用第二种方式。如果是独立服务器,可以直接复制数据库源文件即可,这里就不详细讲解了。
方法:
方法一:如果使用的是虚拟主机,可以用使用phpmyadmin来备份数据库。
1)登陆phpmyadmin。登陆后左边会出现数据库列表,单击要备份的数据库。
2)在弹出的页面中,右侧上部单击“导出”按钮,一般保持默认选桐辩项,最下面“另存斗轮耐为文件”,选择“ZIP压缩”,最后单击执行按钮。
3)弹出保存文件后,保存文件即可。
方法二:如果数据库可以使用外部链接。可以使用SQLyogEnt来备份。
1)打开SQLyogEnt,并登陆mysql服务器。
2)在左边数据库菜单选择要备份的书库,然后右击它。在弹出的菜单中,选择Backup Database as sql dump。
3)在弹出的对话框中,“export to file”即时备份数据库文件要保存的位置,其他保持默认选项,单击“Export”按钮,开始备空春份。
注意事项
linux 备份的数据库怎么恢复
一、 使用mysql相关命令进行简单的本地备份
1 mysqlldump命令
mysqldump 是采用SQL级别的备份机制,它将数据表导成 SQL 脚本文件,在不同的 MySQL 版本之间升级时相对比较合适,这也是最常用的备份方法。
使用 mysqldump进行备份非常简单,如果要备份数据库” db_backup ”,使用命令:
#mysqldump –u -p phpbb_db_backup > /usr/backups/mysql/db_backup.sql
还可以使用gzip命令对备份文件进行压缩:
#mysqldump db_backup | gzip > /usr/backups/mysql/ db_backup.sql.gz (备份后生成的sql不含建宏中库语句!)
只备份一些频繁更新的数据库表:
## mysqldump sample_db articles comments links > /usr/backups/mysql/sample_db.art_comm_lin..sql
上面的命令会备份articles, comments, 和links 三个表。
恢复数据使用命令:
#mysql –u -p db_backup /mnt/backup_share/ db_backup.sql
自动完成网络备份的方法:
Linux 服务器上的程序每天都在更新 MySQL 数据库,于是就想起写一个 shell 脚本,结合 crontab,定时备份数据库。建立一个shell脚本:sample_db_backup.sh
# At the very end the $(date +%F) 自动添加备份日期
mysqldump -u -p -h sample_db > /mnt/backup_share/sample_db.$(date +%F)
#un-mount the filesystem
umount /mnt/backup_share
# mount \u2023o soft 192.168.1.4:/archive /mnt/backup_share
说明:mount NFS服务器的一个重要参数:hard (硬) mount或soft(软)mount。
硬挂载: NFS客户机会不断的尝试与NFS服务器的连接(在后台,一般不会给出任何提示信息),直到挂载上为止。
软挂载:会在前台尝试与NFS服务器的连接,是默认的连接方式。当收到错误信息后终止mount尝试,并给出相关信息。
对于到底是使用硬挂载还是软挂载的问题,这主要取决于你访问什么信息有关。例如你是想察看NFS服务器的视频文件时,你绝对不会希望由于一些意外的情况(如网络速度一下子变的很慢)而使系统输出大量的错误信息,如果此时你用的是硬挂载方式的话,系统就会等待,直到能够重新与NFS 服务器建立连接传输信息。另外如果是非关键数据的话也可以使用软挂载方式,如FTP一些数据等,这样在远程机器暂时连接不上或关闭时就不会挂起你的会话过程。
下面建立脚本文件权限:chmod +x ./sample_db_backup.sh
然后使用将此脚本加到 /etc/crontab 定时任务中:
01 5 * * 0 mysql /home/mysql/ sample_db_backup.sh
好了,每周日凌晨 5:01 系统就会自动运行 sample_db_backup.sh 文件通过网络备份 MySQL 数据库了。
三、实时恢复M y S Q L数据方法
在对MySQL数据和表格结构进行备份时,mysqldump是一个非常有用的工具。然而,通常情况下,一般一天只备份一次,或者在一个特定的间隔备份一次。如果在刚备份完成的一段时间以内数据丢失,那么这些数据很有可能无法恢复。有什么方法可以对数据进行实时性地保护呢?事实上,现在有几种方法都可以实现MySQL数据库的实时保护。这里介绍其中一种,即使用二进制日志进行数据恢复。
1 设置二进制日志方法
要想从二进制日志恢复数据,你需要知道当前二进制日志文件的路径和文件名。一般可以从选项文件(即my.cnf or my.ini,取决于你的系统)中找到路径。如果未包含在选项文件中,当服务器启动时,可以在命令行中以选项的形式给出。启用二进制日志的选项为– log-bin。要想确定当前的二进制日志文件的文件名,输入下面的MySQL语句:
# SHOW BINLOG EVENTS \G
2 最简单的数据恢复
每天备份和运行二进制日志的确是一个在MySQL服务器中恢复数据的不错方法。比如,可以每天在深夜使用mysqldump对数据进行备份,如果某天在数据备份完成后的一段时间里,由于某种原因数据丢失,可以使用以下方法来对其进行恢复。首先,停止MySQL服务器,然后使用以下命令重新启动MySQL服务器。该命令将保证是惟一可以访问该数据库服务器的人:
# /etc/init.d/mysqld stop
Stopping MySQL:
# mysqld –socket=/tmp/mysql_restore.sock –skip-networking
这里, 一socket选项将为U n i x 系统命名一个不同的Socket文件。一旦服务器处于独占控制之下,就可以放心地对数据库进行操作,而不用担心在进行数据恢复的过程中有用户尝试访问数据库而导致更多的麻烦。进行恢复的之一个步骤是恢复晚上备份好的dump文件:
#mysql -u root -pmypwd –socket=/tmp/mysql_restore.sock /tmp/mysql_restore.sql
该命令将在/tmp目录创建小的文本文件,将显示执行了错误的SQL语句时的SQL语句。你可以用vi或者gedit文本编辑器打开该文件,寻找你不要想重复的语句。如果二进制日志中的位置号用于停止和继续恢复操作,应进行注释。用log_pos加一个数字来标记位置。使用位置号恢复了以前的备份文件后,你应从命令行输入下面内容:
mysqlbinlog –stop-position=”368312″ /var/log/mysql/bin.123456
| mysql -u root -pmypwd
mysqlbinlog –start-position=”368315″ /var/log/mysql/bin.123456
| mysql -u root -pmypwd
上面的第1行将恢复到停止位置为止的所有事务。下一行将恢复从给定的起始位置直到二进制日志结束的所有事务。因为mysqlbinlog的输出包括每个SQL语句记录之前的SET TIMESTAMP语句,恢复的数据和相关MySQL日志将反应事务执行的原时间。
关于mysql 恢复数据库语句的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。