社区
MySQL
帖子详情
mysql备份 只要数据
jhldelphi
2009-07-29 09:25:29
mysql备份 只要数据
...全文
79
10
打赏
收藏
mysql备份 只要数据
mysql备份 只要数据
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
jhldelphi
2009-07-30
打赏
举报
回复
[Quote=引用 9 楼 lacasadeco 的回复:]
直接将DATE文件夹拷出来一份就可以了
[/Quote]
innodb类型,也可以拷出来吗
usr_src
2009-07-29
打赏
举报
回复
备份数据库包括三层含义
1.导出整个数据库
进入mysql安装目录下bin目录(当然如果你的bin已经包含在path目录下,在任何目录下都可以)
用法:mysqldump -u 用户名 -p 数据库名 > 导出的文件名
mysqldump -uroot -p test>c:/temp/db_test.backup
输入密码:******
备份成功!现在我们以文本的方式打开c:/temp/db_test.backup这个文件,你会发现新大陆的^_^^_^
2.导出一个表
用法:mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
mysqldump -uroot -p test t_student>c:/temp/db_test.t_student.backup
3.导出一个数据库结构
这个说起来有点抽象,一会儿,我慢慢解释……
用法:mysqldump -uroot -p -d --add-drop-table 数据库名>导出文件名
mysqldump -uroot -p -d --add-drop-table test>c:/temp/db_test.structure.backup
**注意:
-d表示没有数据
--add-drop-table表示在每一个create语句之前添加一个drop table语句
打开c:/temp/db_test.structure.backup文件,和先前的两个文件比较,你会发现该文件里没有我们插入的数据
二、导入数据库
1.source命令
用法:mysql -uroot -p
输入密码:******
mysql>use 数据库名;
mysql>source 备份的数据库文件
mysql>source c:/temp/db_test.backup;
2.直接mysql -uroot -D数据库名 < 备份的数据库文件
>mysql-uroot -p -Dtest <c:/temp/db_test.backup;
输入密码:******
三、数据的导入、导出
1.数据的导入
**注意:文本数据应符合的格式:字段数据之间用tab键隔开,null值用n来代替
这里我给t_student表添加一条记录,格式如下:
1 zhangsan male 1986-11-24
保存为a.data文件名
用法: load data infile "文件名" into table 表名;
或者load data infile "文件名" into table 数据库名.表名
mysql -uroot -p
输入密码:******
mysql>use test;
mysql>load data infile "c:/temp/a.data" into table t_student;
**注意:你最好将文件复制到mysql/bin目录下,并且要先用use命令打表所在的库
2.数据的导出
mysql>select * from 数据库.数据表名 into outfile "文件名"
mysql>select * from test.t_student into outfile "c:/temp/data.out"
当然你也可以先use test;再select * from t_student into outfile "c:/temp/data.out"
1、mysqldump
1.1 备份
mysqldump 是采用SQL级别的备份机制,它将数据表导成 SQL 脚本文件,在不同的 MySQL 版本之间升级时相对比较合适,这也是最常用的备份方法。
现在来讲一下 mysqldump 的一些主要参数:
--compatible=name
它告诉 mysqldump,导出的数据将和哪种数据库或哪个旧版本的 MySQL 服务器相兼容。值可以为 ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options 等,要使用几个值,用逗号将它们隔开。当然了,它并不保证能完全兼容,而是尽量兼容。
--complete-insert,-c
导出的数据采用包含字段名的完整 INSERT 方式,也就是把所有的值都写在一行。这么做能提高插入效率,但是可能会受到 max_allowed_packet 参数的影响而导致插入失败。因此,需要谨慎使用该参数,至少我不推荐。
--default-character-set=charset
指定导出数据时采用何种字符集,如果数据表不是采用默认的 latin1 字符集的话,那么导出时必须指定该选项,否则再次导入数据后将产生乱码问题。
--disable-keys
告诉 mysqldump 在 INSERT 语句的开头和结尾增加 /*!40000 ALTER TABLE table DISABLE KEYS */; 和 /*!40000 ALTER TABLE table ENABLE KEYS */; 语句,这能大大提高插入语句的速度,因为它是在插入完所有数据后才重建索引的。该选项只适合 MyISAM 表。
--extended-insert = true|false
默认情况下,mysqldump 开启 --complete-insert 模式,因此不想用它的的话,就使用本选项,设定它的值为 false 即可。
--hex-blob
使用十六进制格式导出二进制字符串字段。如果有二进制数据就必须使用本选项。影响到的字段类型有 BINARY、VARBINARY、BLOB。
--lock-all-tables,-x
在开始导出之前,提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并且自动关闭 --single-transaction 和 --lock-tables 选项。
--lock-tables
它和 --lock-all-tables 类似,不过是锁定当前导出的数据表,而不是一下子锁定全部库下的表。本选项只适用于 MyISAM 表,如果是 Innodb 表可以用 --single-transaction 选项。
--no-create-info,-t
只导出数据,而不添加 CREATE TABLE 语句。
--no-data,-d
不导出任何数据,只导出数据库表结构。
--opt
这只是一个快捷选项,等同于同时添加 --add-drop-tables --add-locking --create-option --disable-keys --extended-insert --lock-tables --quick --set-charset 选项。本选项能让 mysqldump 很快的导出数据,并且导出的数据能很快导回。该选项默认开启,但可以用 --skip-opt 禁用。注意,如果运行 mysqldump 没有指定 --quick 或 --opt 选项,则会将整个结果集放在内存中。如果导出大数据库的话可能会出现问题。
--quick,-q
该选项在导出大表时很有用,它强制 mysqldump 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中。
--routines,-R
导出存储过程以及自定义函数。
--single-transaction
该选项在导出数据之前提交一个 BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于事务表,例如 InnoDB 和 BDB。
本选项和 --lock-tables 选项是互斥的,因为 LOCK TABLES 会使任何挂起的事务隐含提交。
要想导出大表的话,应结合使用 --quick 选项。
--triggers
同时导出触发器。该选项默认启用,用 --skip-triggers 禁用它。
其他参数详情请参考手册,我通常使用以下 SQL 来备份 MyISAM 表:
/usr/local/mysql/bin/mysqldump -uyejr -pyejr \
--default-character-set=utf8 --opt --extended-insert=false \
--triggers -R --hex-blob -x db_name > db_name.sql
使用以下 SQL 来备份 Innodb 表:
/usr/local/mysql/bin/mysqldump -uyejr -pyejr \
--default-character-set=utf8 --opt --extended-insert=false \
--triggers -R --hex-blob --single-transaction db_name > db_name.sql
另外,如果想要实现在线备份,还可以使用 --master-data 参数来实现,如下:
/usr/local/mysql/bin/mysqldump -uyejr -pyejr \
--default-character-set=utf8 --opt --master-data=1 \
--single-transaction --flush-logs db_name > db_name.sql
它只是在一开始的瞬间请求锁表,然后就刷新binlog了,而后在导出的文件中加入CHANGE MASTER 语句来指定当前备份的binlog位置,如果要把这个文件恢复到slave里去,就可以采用这种方法来做。
1.2 还原
用 mysqldump 备份出来的文件是一个可以直接倒入的 SQL 脚本,有两种方法可以将数据导入。
直接用 mysql 客户端
例如:
/usr/local/mysql/bin/mysql -uyejr -pyejr db_name < db_name.sql
用 SOURCE 语法
其实这不是标准的 SQL 语法,而是 mysql 客户端提供的功能,例如:
SOURCE /tmp/db_name.sql;
这里需要指定文件的绝对路径,并且必须是 mysqld 运行用户(例如 nobody)有权限读取的文件。
2、 mysqlhotcopy
2.1 备份
mysqlhotcopy 是一个 PERL 程序,最初由Tim Bunce编写。它使用 LOCK TABLES、FLUSH TABLES 和 cp 或 scp 来快速备份数据库。它是备份数据库或单个表的最快的途径,但它只能运行在数据库文件(包括数据表定义文件、数据文件、索引文件)所在的机器上。mysqlhotcopy 只能用于备份 MyISAM,并且只能运行在 类Unix 和 NetWare 系统上。
mysqlhotcopy 支持一次性拷贝多个数据库,同时还支持正则表达。以下是几个例子:
root#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr \
db_name /tmp (把数据库目录 db_name 拷贝到 /tmp 下)
root#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr \
db_name_1 ... db_name_n /tmp
root#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr \
db_name./regex/ /tmp
更详细的使用方法请查看手册,或者调用下面的命令来查看 mysqlhotcopy 的帮助:
perldoc /usr/local/mysql/bin/mysqlhotcopy
注意,想要使用 mysqlhotcopy,必须要有 SELECT、RELOAD(要执行 FLUSH TABLES) 权限,并且还必须要能够有读取 datadir/db_name 目录的权限。
2.2 还原
mysqlhotcopy 备份出来的是整个数据库目录,使用时可以直接拷贝到 mysqld 指定的 datadir (在这里是 /usr/local/mysql/data/)目录下即可,同时要注意权限的问题,如下例:
root#cp -rf db_name /usr/local/mysql/data/
root#chown -R nobody:nobody /usr/local/mysql/data/ (将 db_name 目录的属主改成 mysqld 运行用户)
3、 SQL 语法备份
3.1 备份
BACKUP TABLE 语法其实和 mysqlhotcopy 的工作原理差不多,都是锁表,然后拷贝数据文件。它能实现在线备份,但是效果不理想,因此不推荐使用。它只拷贝表结构文件和数据文件,不同时拷贝索引文件,因此恢复时比较慢。
例子:
BACK TABLE tbl_name TO '/tmp/db_name/';
注意,必须要有 FILE 权限才能执行本SQL,并且目录 /tmp/db_name/ 必须能被 mysqld 用户可写,导出的文件不能覆盖已经存在的文件,以避免安全问题。
SELECT INTO OUTFILE 则是把数据导出来成为普通的文本文件,可以自定义字段间隔的方式,方便处理这些数据。
例子:
SELECT * INTO OUTFILE '/tmp/db_name/tbl_name.txt' FROM tbl_name;
注意,必须要有 FILE 权限才能执行本SQL,并且文件 /tmp/db_name/tbl_name.txt 必须能被 mysqld 用户可写,导出的文件不能覆盖已经存在的文件,以避免安全问题。
3.2 恢复
用 BACKUP TABLE 方法备份出来的文件,可以运行 RESTORE TABLE 语句来恢复数据表。
例子:
RESTORE TABLE FROM '/tmp/db_name/';
权限要求类似上面所述。
用 SELECT INTO OUTFILE 方法备份出来的文件,可以运行 LOAD DATA INFILE 语句来恢复数据表。
例子:
LOAD DATA INFILE '/tmp/db_name/tbl_name.txt' INTO TABLE tbl_name;
权限要求类似上面所述。倒入数据之前,数据表要已经存在才行。如果担心数据会发生重复,可以增加 REPLACE 关键字来替换已有记录或者用 IGNORE 关键字来忽略他们。
4、 启用二进制日志(binlog)
采用 binlog 的方法相对来说更灵活,省心省力,而且还可以支持增量备份。
启用 binlog 时必须要重启 mysqld。首先,关闭 mysqld,打开 my.cnf,加入以下几行:
server-id = 1
log-bin = binlog
log-bin-index = binlog.index
然后启动 mysqld 就可以了。运行过程中会产生 binlog.000001 以及 binlog.index,前面的文件是 mysqld 记录所有对数据的更新操作,后面的文件则是所有 binlog 的索引,都不能轻易删除。关于 binlog 的信息请查看手册。
需要备份时,可以先执行一下 SQL 语句,让 mysqld 终止对当前 binlog 的写入,就可以把文件直接备份,这样的话就能达到增量备份的目的了:
FLUSH LOGS;如果是备份复制系统中的从服务器,还应该备份 master.info 和 relay-log.info 文件。
备份出来的 binlog 文件可以用 MySQL 提供的工具 mysqlbinlog 来查看,如:
/usr/local/mysql/bin/mysqlbinlog /tmp/binlog.000001
该工具允许你显示指定的数据库下的所有 SQL 语句,并且还可以限定时间范围,相当的方便,详细的请查看手册。
恢复时,可以采用类似以下语句来做到:
/usr/local/mysql/bin/mysqlbinlog /tmp/binlog.000001 | mysql -uyejr -pyejr db_name
把 mysqlbinlog 输出的 SQL 语句直接作为输入来执行它。
如果你有空闲的机器,不妨采用这种方式来备份。由于作为 slave 的机器性能要求相对不是那么高,因此成本低,用低成本就能实现增量备份而且还能分担一部分数据查询压力,何乐而不为呢?
5、 直接备份数据文件
相较前几种方法,备份数据文件最为直接、快速、方便,缺点是基本上不能实现增量备份。为了保证数据的一致性,需要在靠背文件前,执行以下 SQL 语句:
FLUSH TABLES WITH READ LOCK;也就是把内存中的数据都刷新到磁盘中,同时锁定数据表,以保证拷贝过程中不会有新的数据写入。这种方法备份出来的数据恢复也很简单,直接拷贝回原来的数据库目录下即可。
注意,对于 Innodb 类型表来说,还需要备份其日志文件,即 ib_logfile* 文件。因为当 Innodb 表损坏时,就可以依靠这些日志文件来恢复。
6、 备份策略
对于中等级别业务量的系统来说,备份策略可以这么定:第一次全量备份,每天一次增量备份,每周再做一次全量备份,如此一直重复。而对于重要的且繁忙的系统来说,则可能需要每天一次全量备份,每小时一次增量备份,甚至更频繁。为了不影响线上业务,实现在线备份,并且能增量备份,最好的办法就是采用主从复制机制(replication),在 slave 机器上做备份。
7、 数据维护和灾难恢复
作为一名DBA(我目前还不是,呵呵),最重要的工作内容之一是保证数据表能安全、稳定、高速使用。因此,需要定期维护你的数据表。以下 SQL 语句就很有用:
CHECK TABLE 或 REPAIR TABLE,检查或维护 MyISAM 表
OPTIMIZE TABLE,优化 MyISAM 表
ANALYZE TABLE,分析 MyISAM 表
当然了,上面这些命令起始都可以通过工具 myisamchk 来完成,在这里不作详述。
Innodb 表则可以通过执行以下语句来整理碎片,提高索引速度:
ALTER TABLE tbl_name ENGINE = Innodb;
这其实是一个 NULL 操作,表面上看什么也不做,实际上重新整理碎片了。
通常使用的 MyISAM 表可以用上面提到的恢复方法来完成。如果是索引坏了,可以用 myisamchk 工具来重建索引。而对于 Innodb 表来说,就没这么直接了,因为它把所有的表都保存在一个表空间了。不过 Innodb 有一个检查机制叫 模糊检查点,只要保存了日志文件,就能根据日志文件来修复错误。可以在 my.cnf 文件中,增加以下参数,让 mysqld 在启动时自动检查日志文件:
innodb_force_recovery = 4
ACMAIN_CHM
2009-07-29
打赏
举报
回复
[Quote]select ... INTO OUTFILE可以不可以导出到一个文件里[/Quote]
不可以。
jhldelphi
2009-07-29
打赏
举报
回复
[Quote=引用 2 楼 acmain_chm 的回复:]
如果是只要数据,则
仍然利用mysqldump来导出后,自己手工删除其中的 create table ,create index 等等 DDL 语句。当然你也可以写个脚本来删除这些以create 开头的语句。
或者利用 select ... INTO OUTFILE 把某个表中的数据倒出,这样你需要通过一个脚本将数据库中的所有表的数据依次倒出到不同的文本文件中,以后再用 LOAD DATA INFILE 导入。
[/Quote]
select ... INTO OUTFILE可以不可以导出到一个文件里
jhldelphi
2009-07-29
打赏
举报
回复
[Quote=引用 1 楼 asdfghjkl987 的回复:]
用MYSQLDUMP附加--no-create-db
[/Quote]
这个有use database,不好用于其它的数据库
ACMAIN_CHM
2009-07-29
打赏
举报
回复
如果是只要数据,则
仍然利用mysqldump来导出后,自己手工删除其中的 create table ,create index 等等 DDL 语句。当然你也可以写个脚本来删除这些以create 开头的语句。
或者利用 select ... INTO OUTFILE 把某个表中的数据倒出,这样你需要通过一个脚本将数据库中的所有表的数据依次倒出到不同的文本文件中,以后再用 LOAD DATA INFILE 导入。
ASDFGHJKL987
2009-07-29
打赏
举报
回复
用MYSQLDUMP附加--no-create-db
lacasadeco
2009-07-29
打赏
举报
回复
直接将DATE文件夹拷出来一份就可以了
jhldelphi
2009-07-29
打赏
举报
回复
谢谢大家,我这样做了
mysqldump -umyuser -pmypassword --default-character-set=utf8 --no-create-info --no-create-db --database hst_rsgz0 > d:\1.bak'
vinsonshen
2009-07-29
打赏
举报
回复
你只要数据的话(估计你是只要insert表 values()这种形式),那建议你还是写个过程,逐一遍历所有表,进行每个表select * from tb_name into outfile result文件
php版
mysql
大
数据
库
备份
和恢复工具
1.自动识别
数据
库版本,对于
MySQL
4.1以上,
备份
数据
时提示选择字符集. 2.导入
数据
时,提示原
数据
库编码,并自动识别. 3.增加导入目标
数据
库字符集选项. 4.支持GBK、BIG5、UTF8之间的编码转换(见特别说明4). 特别...
MySQL
:
备份
& 导入
备份
它的
备份
原理是通过协议连接到
MySQL
数据
库,将需要
备份
的
数据
查询出来,将查询出的
数据
转换成对应的insert语句,当需要还原这些
数据
时,只要执行这些insert语句,即可将对应的
数据
还原。 进入
MySQL
: [root@MiWiFi-R1...
MySQL
数据
备份
与恢复
使用免费的第三方Percona xtraBackup热
备份
软件,支持在线热
备份
Innodb和xtraDB,也可以支持
MySQL
表
备份
,不过MyISAM表的
备份
要在表锁的情况下进行。恢复
数据
时,只需恢复上次的完全
备份
与最近的一次差异
备份
。主...
mysql
数据
备份
方法_最快的
MySql
数据
库
备份
方法
最快的
MySql
数据
库
备份
方法...一、
数据
备份
捷径因为这个方法没有得到官方正式文档的验证,我们暂称为试验吧。目的:
备份
hostA主机中一个
mysql
数据
库TestA,并恢复到到hostB机中试验环境:操作系统:WinNT4.0,
Mysql
3...
Mysql
备份
的三种方式
目录 一、
备份
的目的 二、
备份
需要考虑的问题 三、
备份
的类型 ...四、
备份
的对象 ...五、
备份
和恢复的实现 ...1、利用select into outfile实现
数据
的
备份
与...
备份
的本质就是将
数据
集另存一个副本,但是原
数据
会不停的发
MySQL
56,678
社区成员
56,708
社区内容
发帖
与我相关
我的任务
MySQL
MySQL相关内容讨论专区
复制链接
扫一扫
分享
社区描述
MySQL相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章