固定时间mysqlmysql 导出表数据数据的程序

trackbacks-0
Mysql数据库备份的常用3种方法:&1、直接拷贝(cp、tar,gzip,cpio)&2、mysqldump&3、mysqlhotcopy&1.使用直接拷贝数据库备份&典型的如cp、tar或cpio实用程序。&当你使用直接备份方法时,必须保证表不在被使用。如果服务器在你正在拷贝一个表时改变它,拷贝就失去意义。&保证你的拷贝完整性的最好方法是关闭服务器,拷贝文件,然后重启服务器。如果你不想关闭服务器,要在执行表检查的同时锁定服务器。如果服务器在运行,相同的制约也适用于拷贝文件,而且你应该使用相同的锁定协议让服务器&安静下来&。&当你完成了备份时,需要重启服务器(如果关闭了它)或释放加在表上的锁定(如果你让服务器运行)。&要用直接拷贝文件把一个数据库从一台机器拷贝到另一台机器上,只是将文件拷贝到另一台服务器主机的适当数据目录下即可。要确保文件是MyIASM格式或两台机器有相同的硬件结构,否则你的数据库在另一台主机上有奇怪的内容。你也应该保证在另一台机器上的服务器在你正在安装数据库表时不访问它们。&
2.mysqldump&基本语法:&
Shell& mysqldump [OPTIONS] database [tables] & data_backup.sql (不指定数据库名表示全部备份)
mysqldump -uroot -p --default-character-set=cp932 --opt --extended-insert=false --hex-blob -R -x mysql & E:\mysql.sql
输出文件的开头看起来象这样:&
# MySQL Dump 6.0&#&# Host: localhost Database: samp_db&#---------------------------------------&# Server version 3.23.2-alpha-log&#&# Table structure for table 'absence'&#&CREATE TABLE absence(&student_id int(10) unsigned DEFAULT '0' NOT NULL,&date date DEFAULT '' NOT NULL,&PRIMARY KEY (student_id,date)&);&#&# Dumping data for table 'absence'&#&INSERT INTO absence VALUES (3,'');&INSERT INTO absence VALUES (5,'');&INSERT INTO absence VALUES (10,'');&...... 
文件剩下的部分有更多的INSERT和CREATE TABLE语句组成。例:&
%mysqldump samp_db &/opt/mysqldatabak/samp_db.2006-5-15&%mysqldump samp_db | gzip &/usr/archives/mysql/samp_db.1999-10-02.gz #产生压缩备份&%mysqldump samp_db student score event absence &grapbook.sql #备份数据库的某些表&%mysqladmin -h boa.snake.net create samp_db&%mysqldump samp_db | mysql -h boa.snake.net samp_db #直接恢复到另一个服务器上使用--add-drop-table选项告诉服务器将DROP TABLE IF EXISTS语句写入备份文件,这样当我们以后用来恢复数据库时,如果表已经存在,你不会得到一个错误。&%mysqldump --add-drop-table samp_db | mysql -h boa.snake.net samp_db
mysqldump其它有用的选项包括:&--flush-logs和--lock-tables组合将对你的数据库检查点有帮助。--lock-tables锁定你正在倾倒的所有表,而--flush-logs关闭并重新打开更新日志文件,新的更新日志将只包括从备份点起的修改数据库的查询。这将设置你的更新日志检查点位备份时间。(然而如果你有需要执行个更新的客户,锁定所有表对备份期间的客户访问不是件好事。)&如果你使用--flush-logs设置检查点到备份时,有可能最好是倾倒整个数据库。如果你倾倒单独的文件,较难将更新日志检查点与备份文件同步。在恢复期间,你通常按数据库为基础提取更新日志内容,对单个表没有提取更新的选择,所以你必须自己提取它们。&缺省地,mysqldump在写入前将一个表的整个内容读进内存。这通常确实不必要,并且实际上如果你有一个大表,几乎是失败的。你可用--quick选项告诉mysqldump只要它检索出一行就写出每一行。为了进一步优化倾倒过程,使用--opt而不是--quick。--opt选项打开其它选项,加速数据的倾倒和把它们读回。&用--opt实施备份可能是最常用的方法,因为备份速度上的优势。然而,要警告你,--opt选项确实有代价,--opt优化的是你的备份过程,不是其他客户对数据库的访问。--opt选项通过一次锁定所有表阻止任何人更新你正在倾倒的任何表。你可在一般数据库访问上很容易看到其效果。&一个具有--opt的相反效果的选项是--dedayed。该选项使得mysqldump写出INSERT DELAYED语句而不是INSERT语句。如果你将数据文件装入另一个数据库并且你想使这个操作对可能出现在该数据库中的查询的影响最小,--delayed对此很有帮助。&--compress选项在你拷贝数据库到另一台机器上时很有帮助,因为它减少网络传输字节的数量。下面有一个例子,注意到--compress对与远端主机上的服务器通信的程序才给出,而不是对与本地主机连接的程序:&
%mysqldump --opt samp_db | mysql --compress -h boa.snake.net samp_db
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 参数的影响而导致插入失败。因此,需要谨慎使用该参数,至少我不推荐。&--extended-insert = true|false&默认情况下,mysqldump 开启 --complete-insert 模式,因此不想用它的的话,就使用本选项,设定它的值为 false 即可。&--default-character-set=charset&指定导出数据时采用何种字符集,如果数据表不是采用默认的 latin1 字符集的话,那么导出时必须指定该选项,否则再次导入数据后将产生乱码问题。&--disable-keys&告诉 mysqldump 在 INSERT 语句的开头和结尾增加 /*!40000 ALTER TABLE table DISABLE KEYS */; 和 /*!40000 ALTER TABLE table ENABLE KEYS */; 语句,这能大大提高插入语句的速度,因为它是在插入完所有数据后才重建索引的。该选项只适合 MyISAM 表。&--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 禁用它。
&3.mysqlhotcopy备份&mysqlhotcopy是一个Perl脚本,最初由Tim Bunce编写并提供。它使用LOCK TABLES、FLUSH TABLES和cp或scp来快速备份数据库。它是备份数据库或单个表的最快的途径,但它只能运行在数据库目录所在的机器上。mysqlhotcopy只用于备份MyISAM。它运行在Unix和NetWare中&使用方法见下面的脚本.加入crotab中吧.&
#!/bin/sh&# Name:mysqlbackup.sh&# PS:MySQL DataBase Backup,Use mysqlhotcopy script.&# Last Modify:&# 定义变量,请根据具体情况修改&# 定义脚本所在目录&scriptsDir=`pwd`&# 数据库的数据目录&dataDir=/var/lib/mysql&# 数据备份目录&tmpBackupDir=/tmp/mysqlblackup&backupDir=/backup/mysql&# 用来备份数据库的用户名和密码&mysqlUser=root&mysqlPWD='you password'&# 如果临时备份目录存在,清空它,如果不存在则创建它&if [[ -e $tmpBackupDir ]]; then&rm -rf $tmpBackupDir/*&else&mkdir $tmpBackupDir&fi&# 如果备份目录不存在则创建它&if [[ ! -e $backupDir ]];then&mkdir $backupDir&fi&# 得到数据库备份列表,在此可以过滤不想备份的数据库&for databases in `find $dataDir -type d | \&sed -e "s/\/var\/lib\/mysql\///" | \&sed -e "s/test//"`; do&if [[ $databases == "" ]]; then&continue&else&# 备份数据库&/usr/bin/mysqlhotcopy --user=$mysqlUser --password=$mysqlPWD -q "$databases" $tmpBackupDir&dateTime=`date "+%Y.%m.%d %H:%M:%S"`&echo "$dateTime Database:$databases backup success!" &&MySQLBackup.log&fi&done&# 压缩备份文件&date=`date -I`&cd $tmpBackupDir&tar czf $backupDir/mysql-$date.tar.gz ./&#End完成
&加入到crontab中设置每周5运行&
0 0 * * 5 /backup/blackup.sh
注意:恢复数据库到备份时的状态&mysqlhotcopy 备份出来的是整个数据库目录,使用时可以直接拷贝到 mysqld 指定的 datadir (在这里是 /var/lib/mysql/)目录下即可,同时要注意权限的问题,如下例:&
shell& cp -rf db_name /var/lib/mysql/&shell& chown -R mysql:mysql /var/lib/mysql/ (将 db_name 目录的属主改成 mysqld 运行用户)
本套备份策略只能恢复数据库到最后一次备份时的状态,要想在崩溃时丢失的数据尽量少应该更频繁的进行备份,要想恢复数据到崩溃时的状态请使用主从复制机制(replication)。&小技巧:&不想写密码在shell中的话,可以在root的home目录下建立一个.my.cnf文件,以便让mysqlhotcopy从中读取用户名/密码。&
[mysqlhotcopy]&user=root&password=YourPassword
然后安全起见,chmod一下。&
chmod 600 ~/.my.cnf
附:mysqlhotcopy常用参数:&& --allowold 如果目标存在不放弃(加上一个_old后缀重新命名它)。&& --checkpoint=db_name.tbl_name 在指定的db_name.tbl_name插入检查点条目。&& ---debug 启用调试输出。&& --dryrun,-n 报告动作而不执行它们。&& --flushlog 所有表锁定后刷新日志。&& --keepold 完成后不删除以前(重新命名的)的目标。&& -- method=command 复制方法(cp或scp)。&& --noindices 备份中不包括全部索引文件。这样使备份更小、更快。可以在以后用myisamchk -rq重新构建索引。&& --password=password,-p password 当连接服务器时使用的密码。请注意该选项的密码值是不可选的,不象其它MySQL程序。&& --port=port_num,-P port_num 当连接本地服务器时使用的TCP/IP端口号。&& --quiet,-q 除了出现错误时保持沉默。&& --regexp=expr 复制所有数据库名匹配给出的正则表达式的数据库。&& --socket=path,-S path 用于连接的Unix套接字文件。&& --suffix=str 所复制的数据库名的后缀。&& --tmpdir=path 临时目录(代替/tmp)。&& --user=user_name,-u user_name 当连接服务器时使用的MySQL用户名。&mysqlhotcopy从选项文件读取[client]和[mysqlhotcopy]选项组。要想执行mysqlhotcopy,你必须可以访问备份的表文件,具有那些表的SELECT权限和RELOAD权限(以便能够执行FLUSH TABLES)。
阅读(...) 评论()数据库(17)
1、mysqldump&命令工具说明
参数注解:
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&禁用它。
1.导出整个数据库(–hex-blob 为有blob数据做的,防止乱码和导入失败用)
mysqldump -u 用户名 -p 数据库名 & 导出的文件名
mysqldump -u root -p --default-character-set=gbk --hex-blob i5a6 & i5a6.sql
2.导出一个表
mysqldump -u 用户名 -p 数据库名 表名& 导出的文件名
mysqldump -u root -p i5a6 &users& i5a6.sql
3.导出一个数据库结构
mysqldump -u root -p -d --add-drop-table i5a6 &d:/i5a6.sql
-d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table
4.导入数据库
常用source 命令
进入mysql数据库控制台,
如mysql -u root -p
mysql&use 数据库
然后使用source命令,后面参数为脚本文件(如这里用到的.sql)
mysql&source d:/i5a6.sql
5、Shell脚本
上面都是比较散的代码,下面我们来看shell代码
& &我首先要在本文带给你的是完整脚本。后面会对该脚本做说明。我假定你已经知道shell scripting、 mysqldump和crontab。
数据库导出代码,代码如下
#!/bin/bash
#1.数据库信息定义
mysql_host=&192.168.1.1&
mysql_user=&root&
mysql_passwd=&root&
#sql备份目录
root_dir=&/backup&
back_dir=&/backup/databases&
data_dir=&databases&
store_dir=&database&
if [ ! -d $back_dir ]; then
&mkdir -p $back_dir
#备份的数据库数组
db_arr=$(echo && | mysql -u$mysql_user -p$mysql_passwd -h$mysql_host)
#不需要备份的单例数据库
nodeldb=&test1&
date=$(date -d '+0 days' +%Y%m%d)
#zip打包密码
zippasswd=&passwd&
zipname=&lczh_&$date&.zip&
#2.进入到备份目录
cd $back_dir
#3.循环备份
for dbname in ${db_arr}
&if [ $dbname != $nodeldb ]; then
& sqlfile=$dbname-$date&.sql&
& mysqldump -u$mysql_user -p$mysql_passwd -h$mysql_host $dbname &$sqlfile
#4.tar打包所有的sql文件
tar -zcPpf $root_dir/$store_dir/$zipname --directory / &$root_dir/$data_dir
#打包成功后删除sql文件
if [ $? = 0 ]; then
&rm -r $data_dir
数据定期清理脚本
定期清理14天前的备份文件
&代码如下 复制代码
#!/bin/bash -
#1.参数配置
#mysql文件备份目录
backup_dir1=&/backup/test1/&
backup_dir2=&/backup/test2/&
backdir_arr=($backup_dir1 $backup_dir2)
#过期文件的时间
keep_time=14
#当前所在星期,crontab在奇数的星期7执行
week=$(date +%W)
flag=`expr $week % 2`
#2.清理过期文件,只在奇数星期7执行
if [ $flag -eq 1 ]; then
&for dir in ${backdir_arr[*]}
& if [ -d $dir ]; then
& &#查找14天之外的文件数据
& &clean_arr=`find $dir -type f -mtime +$keep_time -exec ls {} ;`
& &for cleanfile in ${clean_arr}
& & rm $cleanfile
crontab配置
0 5 * * 7 &执行清理脚本
最近在备份还原mysql&的时候发现,视图还原报错,无法创建视图,在网上查了下资料,找到以下信息:
1&、如果备份的数据库含有视图,&还原时需要把my.ini&中的character-set&改为latin1,&才能够还原视图。
2&、还原后,&需要把latin1&改为gb2312,&否则存储过程不能使用.
3&、存储过程不能随着数据库备份,对于存储过程的还原,还是通过手工复制SQL&语句,在QUERY&里执行。
感觉有点麻烦,于是又寻找其它方法,通过以下方法备份mysql&数据库后,再进行还原,就没有报错,视图也还原进去了:
#windows&下mysql&备份还原,可不用修改my.ini&来还原视图(&已验证)
mysqldump -uroot -p123 --default-character-set=gbk --opt --extended-insert=false --triggers -R --hex-blob -x db_name & f:\db.sql
mysql -uroot -p123 -f db_name & f:\db.sql
SQL&来备份&MyISAM&表:
/usr/local/mysql/bin/mysqldump -uroot -p123 --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 -uroot -p123 --default -character-set=utf8 --opt --extended-insert=false --triggers -R --hex-blob --single-transaction db_name & db_name.sql
添加时间:
mysqldump -uroot --default-character-set=utf8 --hex-blob -p&kEy31kG_& gameonline | gzip & /data/mysqlback/gameonline`date +%Y-%m-%d_%H%M%S`.sql.gz
最近在备份还原mysql&的时候发现,视图还原报错,无法创建视图,在网上查了下资料,找到以下信息:
1&、如果备份的数据库含有视图,&还原时需要把my.ini&中的character-set&改为latin1,&才能够还原视图。
2&、还原后,&需要把latin1&改为gb2312,&否则存储过程不能使用.
3&、存储过程不能随着数据库备份,对于存储过程的还原,还是通过手工复制SQL&语句,在QUERY&里执行。
感觉有点麻烦,于是又寻找其它方法,通过以下方法备份mysql&数据库后,再进行还原,就没有报错,视图也还原进去了:
#windows&下mysql&备份还原,可不用修改my.ini&来还原视图(&已验证)
mysqldump -uroot -p123 --default-character-set=gbk --opt --extended-insert=false --triggers -R --hex-blob -x db_name & f:\db.sql
mysql -uroot -p123 -f db_name & f:\db.sql
SQL&来备份&MyISAM&表:
/usr/local/mysql/bin/mysqldump -uroot -p123 --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 -uroot -p123 --default -character-set=utf8 --opt --extended-insert=false --triggers -R --hex-blob --single-transaction db_name & db_name.sql
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:166941次
积分:2632
积分:2632
排名:第9623名
原创:60篇
转载:198篇
评论:14条
(3)(2)(5)(2)(1)(2)(12)(6)(3)(3)(16)(31)(9)(21)(6)(19)(7)(3)(5)(12)(56)(42)微信公众号:centoscn
shell脚本批量导出MYSQL数据库日志
mysqlbinlog
从二进制日志读取语句的工具。在二进制日志文件中包含的执行过的语句的日志可用来帮助从崩溃中恢复。
一、MYSQL数据库日志,有以下几种日志:
1.错误日志: -log-error
2.查询日志: -log
3.慢查询日志: -log-slow-queries
4.更新日志: -log-update
5.二进制日志: -log-bin
这里讨论的是MYSQL二进制日志的导出、导入;MYSQL二进制日志完整备份,增量备份。
默认情况下,所有日志创建于mysqld数据目录中,或者手工指定/f [mysqld] 设置段的选项设置。
在linux下:
# 在[mysqld] 中入
log_long_format
log-bin = /data/mysql/3306/binlog
binlog_cache_size = 4M
binlog_format = MIXED
max_binlog_cache_size = 16M
max_binlog_size = 512M
expire_logs_days = 30
以上,开启MYSQL的二进制日志,并指定保存日志的路径。
binlog日志打开方法
在my.cnf这个文件中加一行(Windows为my.ini)。
log-bin=mysqlbin-log #添加这一行就ok了=号后面的名字自己定义吧&
然后我们可以对数据库做简单的操作后到mysql数据文件所在的目录来看binlog文件&
[root@jimmyli mysql]# ll&
-rw-rw---- 1 mysql mysql 813255 Nov 25 18:14 mysqlbin-log.000001&
看到这个类似的文件,证明搞定了。
二、查看二进制日志文件用mysqlbinlog命令
是否启用了日志
mysql&show variables like 'log_%';
怎样知道当前的日志
显示二M制日志数目
看二进制日志文件用mysqlbinlog
shell&mysqlbinlog mail-bin.000001
或者shell&mysqlbinlog mail-bin.000001 | tail 9000
查看二进制日志文件最后(倒数)9000行的SQL日志记录
三、shell脚本批量导出MYSQL数据库日志
按照最近N天的形式导出二进制日志
上面的设置中,MYSQL二进制日志保存了30天,mail-bin.000001类似文件保存的大小为512M。根据网站的运营需要,需要将MYSQL二进制日志完整备份,增量备份,按照最近N天的形式导出日志文件,以TXT文件保存。
shell代码如下:
#!/bin/bash
iday=60 #循环导出60天的mysqlbinlog日志
startday=$(date -d "-$iday day" +"%y-%m-%d")
stopday=$(date +"%y-%m-%d")
# while [ "$startday" != "$stopday" ]
while [ $iday -ge 1 ]
#while (("$iday" &= 1))
echo $iday
startday=$(date -d "-$iday day" +"%y-%m-%d")
echo startday=$startday
echo stopday=$stopday
./mysqlbinlog --start-datetime="$startday 00:00:00" --stop-datetim="$startday 23:59:59" binlog.*[0-9] & $startday.txt
echo ---------------
iday=`expr $iday - 1`
执行结果如下
[root@JimmyLi bin]# ./test.sh
startday=12-04-17
stopday=12-06-16
---------------
#中间忽略#
startday=12-06-15
stopday=12-06-16
---------------
从12-04-17.txt到12-06-15.txt共60天的日志,以天为单位,每一个日期生成当天的mysqlbinlog日志。
四、自动本地导出MYSQL二进制日志,按天备份
可以将mysqlbinlog的输出传到mysql客户端以执行包含在二进制日志中的语句。如果你有一个旧的备份,该选项在崩溃恢复时也很有用:
shell& mysqlbinlog hostname-bin.000001 | mysql
shell& mysqlbinlog hostname-bin.[0-9]* | mysql
shell& mysqlbinlog hostname-bin.*[0-9] & bin.txt
如果你需要先修改含语句的日志,还可以将mysqlbinlog的输出重新指向一个文本文件。
(例如,想删除由于某种原因而不想执行的语句)。编辑好文件后,将它输入到mysql程序并执行它包含的语句。
自动本地导出MYSQL二进制日志,按天备份命令:
shell&./mysqlbinlog --start-datetime="12-06-16 00:00:00" --stop-datetim="12-06-16 23:59:59" binlog.*[0-9] & 12-06-16.txt
五、讨论如果MySQL服务器上有多个要执行的二进制日志,安全的处理方法。
mysqlbinlog有一个--position选项,只打印那些在二进制日志中的偏移量大于或等于某个给定位置的语句(给出的位置必须匹配一个事件的开始)。
它还有在看见给定日期和时间的事件后停止或启动的选项。这样可以使用--stop-datetime选项进行点对点恢复(例如,能够说“将数据库前滚动到今天10:30 AM的位置”)。
如果MySQL服务器上有多个要执行的二进制日志,安全的方法是在一个连接中处理它们。下面是一个说明什么是不安全的例子:
shell& mysqlbinlog hostname-bin.000001 | mysql -u root
shell& mysqlbinlog hostname-bin.000002 | mysql -u root
使用与服务器的不同连接来处理二进制日志时,如果第1个日志文件包含一个CREATE TEMPORARY TABLE语句,第2个日志包含一个使用该临时表的语句,则会造成问题。当第1个mysql进程结束时,服务器撤销临时表。当第2个mysql进程想使用该表时,服务器报告 “不知道该表”。
要想避免此类问题,使用一个连接来执行想要处理的所有二进制日志中的内容。下面提供了一种方法:
shell& mysqlbinlog hostname-bin.000001 hostname-bin.000002 | mysql
另一个方法是:
shell& mysqlbinlog hostname-bin.000001 && /tmp/statements.sql
shell& mysqlbinlog hostname-bin.000002 && /tmp/statements.sql
shell& mysql -e "source /tmp/statements.sql"
mysqlbinlog产生的输出可以不需要原数据文件即可重新生成一个LOAD DATA INFILE操作。mysqlbinlog将数据复制到一个临时文件并写一个引用该文件的LOAD DATA LOCAL INFILE语句。由系统确定写入这些文件的目录的默认位置。要想显式指定一个目录,使用--local-load选项。
因为mysqlbinlog可以将LOAD DATA INFILE语句转换为LOAD DATA LOCAL INFILE语句(也就是说,它添加了LOCAL),用于处理语句的客户端和服务器必须配置为允许LOCAL操作。
警告:为LOAD DATA LOCAL语句创建的临时文件不会自动删除,因为在实际执行完那些语句前需要它们。不再需要语句日志后应自己删除临时文件。文件位于临时文件目录中,文件名类似original_file_name-#-#。
六、其他查看MYSQL日志的相关命令
1. 查看自己的BINLOG的名字是什么
+---------------+-----------+
| Log_name&&&&& | File_size |
+---------------+-----------+
| binlog.000044 |
| binlog.000045 |&&& 267061 |
+---------------+-----------+
2 rows in set (0.00 sec)
以后每次对表的相关操作时候,这个File_size都会增大。
2. 做了几次操作后,它就记录了下来。
命令:show binlog events
3. 用mysqlbinlog 工具来显示记录的二进制结果,然后导入到文本文件,为了以后的恢复。
详细过程如下:
C:\Program Files\MySQL\MySQL Server 5.0\bin&mysqlbinlog --start-position=4 --sto
p-position=106 mysqlbin-log.000001 & c:\\test1.txt
或者全部导出:
C:\Program Files\MySQL\MySQL Server 5.0\bin&mysqlbinlog mysqlbin-log.000001 & c:\\test1.txt
4. 导入结果到MYSQL中进行数据恢复。
C:\Program Files\MySQL\MySQL Server 5.0\bin&mysqlbinlog --start-position=134 --stop-position=330 mysqlbin-log.000001 | mysql -uroot -p
C:\Program Files\MySQL\MySQL Server 5.0\bin&mysqlbinlog --start-position=134 --stop-position=330 mysqlbin-log.000001 &test1.txt
进入MYSQL导入
mysql& source c:\\test1.txt
还有一种办法是根据日期来恢复
C:\Program Files\MySQL\MySQL Server 5.0\bin &mysqlbinlog --start-datetime=" 0:20:00" --stop-datetim=" 01:25:00" /diskb/bin-logs/xxx_db-bin.000001 | mysql -u root
5、查看数据
Select * from User
6、其他MYSQL日志命令
是否启用了日志
mysql&show variables like 'log_%';
怎样知道当前的日志
显示二M制日志数目
看二进制日志文件用mysqlbinlog
shell&mysqlbinlog mail-bin.000001
或者shell&mysqlbinlog mail-bin.000001 | tail 9000
查看二进制日志文件最后(倒数)9000行的SQL日志记录
mysqlbinlog用法详细说明
服务器生成的二进制日志文件写成二进制格式。要想检查这些文本格式的文件,应使用mysqlbinlog实用工具。
应这样调用mysqlbinlog:
shell& mysqlbinlog [options] log-files...例如,要想显示二进制日志binlog.000003的内容,使用下面的命令:
shell& mysqlbinlog binlog.0000003输出包括在binlog.000003中包含的所有语句,以及其它信息例如每个语句花费的时间、客户发出的线程ID、发出线程时的时间戳等等。
通常情况,可以使用mysqlbinlog直接读取二进制日志文件并将它们用于本地MySQL服务器。也可以使用--read-from-remote-server选项从远程服务器读取二进制日志。
当读取远程二进制日志时,可以通过连接参数选项来指示如何连接服务器,但它们经常被忽略掉,除非你还指定了--read-from-remote-server选项。这些选项是--host、--password、--port、--protocol、--socket和--user。
还可以使用mysqlbinlog来读取在复制过程中从服务器所写的中继日志文件。中继日志格式与二进制日志文件相同。
mysqlbinlog支持下面的选项:
---help,-?
显示帮助消息并退出。
---database=db_name,-d db_name
只列出该数据库的条目(只用本地日志)。
--force-read,-f
使用该选项,如果mysqlbinlog读它不能识别的二进制日志事件,它会打印警告,忽略该事件并继续。没有该选项,如果mysqlbinlog读到此类事件则停止。
--hexdump,-H
在注释中显示日志的十六进制转储。该输出可以帮助复制过程中的调试。在MySQL 5.1.2中添加了该选项。
--host=host_name,-h host_name
获取给定主机上的MySQL服务器的二进制日志。
--local-load=path,-l pat
为指定目录中的LOAD DATA INFILE预处理本地临时文件。
--offset=N,-o N
跳过前N个条目。
--password[=password],-p[password]
当连接服务器时使用的密码。如果使用短选项形式(-p),选项和 密码之间不能有空格。如果在命令行中--password或-p选项后面没有 密码值,则提示输入一个密码。
--port=port_num,-P port_num
用于连接远程服务器的TCP/IP端口号。
--position=N,-j N
不赞成使用,应使用--start-position。
--protocol={TCP | SOCKET | PIPE | -position
使用的连接协议。
--read-from-remote-server,-R
从MySQL服务器读二进制日志。如果未给出该选项,任何连接参数选项将被忽略。这些选项是--host、--password、--port、--protocol、--socket和--user。
--result-file=name, -r name
将输出指向给定的文件。
--short-form,-s
只显示日志中包含的语句,不显示其它信息。
--socket=path,-S path
用于连接的套接字文件。
--start-datetime=datetime
从二进制日志中第1个日期时间等于或晚于datetime参量的事件开始读取。datetime值相对于运行mysqlbinlog的机器上的本地时区。该值格式应符合DATETIME或TIMESTAMP数据类型。例如:
shell& mysqlbinlog --start-datetime=" 11:25:56" binlog.000003该选项可以帮助点对点恢复。
--stop-datetime=datetime
从二进制日志中第1个日期时间等于或晚于datetime参量的事件起停止读。关于datetime值的描述参见--start-datetime选项。该选项可以帮助及时恢复。
--start-position=N
从二进制日志中第1个位置等于N参量时的事件开始读。
--stop-position=N
从二进制日志中第1个位置等于和大于N参量时的事件起停止读。
--to-last-logs,-t
在MySQL服务器中请求的二进制日志的结尾处不停止,而是继续打印直到最后一个二进制日志的结尾。如果将输出发送给同一台MySQL服务器,会导致无限循环。该选项要求--read-from-remote-server。
--disable-logs-bin,-D
禁用二进制日志。如果使用--to-last-logs选项将输出发送给同一台MySQL服务器,可以避免无限循环。该选项在崩溃恢复时也很有用,可以避免复制已经记录的语句。注释:该选项要求有SUPER权限。
--user=user_name,-u user_name
连接远程服务器时使用的MySQL用户名。
--version,-V
显示版本信息并退出。
还可以使用--var_name=value选项设置下面的变量:
open_files_limit
指定要保留的打开的文件描述符的数量。
--hexdump选项可以在注释中产生日志内容的十六进制转储:
shell& mysqlbinlog --hexdump master-bin.000001上述命令的输出应类似十六进制转储:
出处:http://jimmyli./&Jimmy Li Blog&
------分隔线----------------------------

我要回帖

更多关于 mysql导出数据库命令 的文章

 

随机推荐