远程linux还原本地bak文件夹,备份与还原-dahailinux-ChinaUnix博客

一、tar备份:

1、备份数据库:

/etc/rc.d/init.d/mysqld stop

tar cvfz phpbb2_db_20020601.tgz phpbb2

/etc/rc.d/init.d/mysqld start

2、还原数据库:

/etc/rc.d/init.d/mysqld.stop

mv phpbb2 phpbb2_error

tar xvfz phpbb2_db_20020601.tgz

/etc/rc.d/init.d/mysqld.start

二、每日24:00自动备份数据库

利用系统crontab来定时执行备份文件,按日期对备份结果进行保存,达到备份的目的。

1、创建保存备份文件的路径/mysqldata

#mkdir /mysqldata

2、创建/usr/sbin/bakmysql文件

查找数据库库文件的路径:

一般都是:/var/lib/mysql,或者,/usr/local/mysql/var

查找方法:

1、/usr/local/mysql/bin/mysql -u root -p   进入数据库

2、输入:show databases;

3、这是可以查看到所有的数据库,然后

4、find / -name db(你想查找的数据库名)

之后:#vi /usr/sbin/bakmysql

输入

rq=` date +%Y%m%d `

tar zcvf /mysqldata/mysql$rq.tar.gz /var/lib/mysql

保存退出。

3、修改文件属性,使其可执行

# chmod +x /usr/sbin/bakmysql

新建任务:

首先查看一下crontab的任务列表:

crontab -l

然后新建:

crontab -e

添加一行

00 04 * * * root /usr/sbin/bakmysql

表示每天24点钟执行备份

保存退出。

5、重新启动crond

# /etc/rc.d/init.d/crond restart

完成。

这样每天你在/mysqldata可以看到这样的文件

mysql20040619.tar.gz

三、dump备份恢复

1、备份数据库:

mysqladmin -uroot -p flush-logs     生成一个mysql-bin.00000X文件,最好定期执行

mysqldump phpbb2 --flush-logs -uroot -p --opt > phpbb2_20020601.sql

2、修改数据库,比如:

mysql> create table name1 (id int(3) auto_increment not null primary key, xm char(8),xb char(2),csny date);

3、还原数据库:

shell > mv phpbb2 phpbb2.bak

[root@bogon mysql]# mysql -uroot -p123456

mysql > create database phpbb2;

mysql> flush privileges;

shell > mysql phpbb2 -uroot -p123456 < phpbb2_20020601.sql

这是数据库已经还原回去了。理解:其实dump命令是导入导出数据库,对数据库命令进行记录,然后覆盖以后操作,就相当于命令重新执行了一便,已达到备份恢复的目的。

一)、启用Binary Log

修改MySQL Server的系统设置文件(eg. /etc/my.cnf),在[mysqld]区块中加上log-bin=mysql-bin选项,然后重新启动MySQL Server,例如:[mysqld]

log-bin

启用后你应该可以在MySQL的Data Dir里面发现如下的文件:mysql-bin.index

mysql-bin.000001

mysql-bin.000002

...............

mysql-bin.00000X

MySQL在以下几种情况会进行lograrote:

*执行Flush Logs命令* MySQL Server重新启动*设置文件中有进行额外的设置

注:请注意,当你使用mysqldump进行数据库备份时请记得加上--flush-logs选项,例如:mysqldump --flush-logs -u root -p数据库名称> example.sql

这么做的目的是在备份时让MySQL Server进行logrotate,这样子日后要辨别"最后一次备份时间点"之后的Binary Log会比较方便,因为若你没有主动(或通过设置)去删除Binary Log,则只要你的硬盘空间够大,MySQL会无限期的保存Binary Log,也就是说你的Binary Log里面所记载的数据有可能包含"最后一次备份时间点"之前的数据。

定期执行mysqladmin flush-log来实现记录日志文件

二):还原增量备份

1.指定恢复时间对于MySQL 4.1.4,可以在mysqlbinlog语句中通过--start-date和--stop-date选项指定DATETIME格式的起止时间。举例说明,假设在今天上午10:00(今天是2005年4月20日),执行SQL语句来删除一个大表。要想恢复表和数据,你可以恢复前晚上的备份,并输入:mysqlbinlog --stop-date="2005-04-20 9:59:59" /var/log/mysql/bin.123456

| mysql -u root -pmypwd该命令将恢复截止到在--stop-date选项中以DATETIME格式给出的日期和时间的所有数据。如果你没有检测到几个小时后输入的错误的SQL语句,可能你想要恢复后面发生的活动。根据这些,你可以用起使日期和时间再次运行mysqlbinlog:mysqlbinlog --start-date="2005-04-20 10:01:00" /var/log/mysql/bin.123456

| mysql -u root -pmypwd在该行中,从上午10:01登录的SQL语句将运行。组合执行前夜的转储文件和mysqlbinlog的两行可以将所有数据恢复到上午10:00前一秒钟。你应检查日志以确保时间确切。下一节介绍如何实现。2.指定恢复位置也可以不指定日期和时间,而使用mysqlbinlog的选项--start-position和--stop-position来指定日志位置。它们的作用与起止日选项相同,不同的是给出了从日志起的位置号。使用日志位置是更准确的恢复方法,特别是当由于破坏性SQL语句同时发生许多事务的时候。要想确定位置号,可以运行mysqlbinlog寻找执行了不期望的事务的时间范围,但应将结果重新指向文本文件以便进行检查。操作方法为:mysqlbinlog --start-date="2005-04-20 9:55:00" --stop-date="2005-04-20 10:05:00"

/var/log/mysql/bin.123456 > /tmp/mysql_restore.sql该命令将在/tmp目录创建小的文本文件,将显示执行了错误的SQL语句时的SQL语句。你可以用文本编辑器打开该文件,寻找你不要想重复的语句。如果二进制日志中的位置号用于停止和继续恢复操作,应进行注释。用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日志将反应事务执行的原时间。

三),实际执行转换后的Binary Log很简单,只要一行简单的命令:mysql < example.sql

总结:

(1)指定点恢复:

mysqlbinlog --stop-position=2448--start-position=918 mysqld-bin.000007 |mysql -D test

其中--stop-position和--start-position的值为文件中的end_log_pos

(2)指定时间点恢复

mysqlbinlog --start-date="2009-06-24 13:11:01" --stop-date="2009-06-24 14:27:31"mysqld-bin.000007 |mysql -D test

五、利用binlog增量备份,还原实例

一,什么是增量备份

增量备份,就是将新增加的数据进行备份。假如你一个数据库,有10G的数据,每天会增加10M的数据,数据库每天都要备份一次,这么多数据是不是都要备份呢?还是只要备份增加的数据呢,很显然,我只要备份增加的数据。这样减少服务器的负担。

二,启用binlog

vi my.cnf

log-bin=/var/lib/mysql/mysql-bin.log,如果是这样的话log-bin=mysql-bin.log默认在datadir目录下面

[root@BlackGhost mysql]# ls |grep mysql-bin

mysql-bin.000001

mysql-bin.000002

mysql-bin.000003

mysql-bin.000004

mysql-bin.000005

mysql-bin.000006

mysql-bin.index

启动后会产生mysql-bin这样的文件,每启动一次,就会增加一个或者多个。

mysql-bin.000002这样文件存放的是数据库每天增加的数据,所有数据库的数据增量都在这里面。

三,查看mysql-bin.000002这样的文件里面到底是什么东西

[root@BlackGhost mysql]# mysqlbinlog   /var/lib/mysql/mysql-bin.000002 > /tmp/add.sql

[root@BlackGhost mysql]# cat /tmp/add.sql   //下面是根据mysql-bin生成的文件(部分内容)

/*!40019 SET @@session.max_insert_delayed_threads=0*/;

/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;

DELIMITER /*!*/;

# at 4

#100929 21:23:52 server id 1  end_log_pos 106     Start: binlog v 4, server v 5.1.50-log created 100929 21:23:52 at startup

# Warning: this binlog was not closed properly. Most probably mysqld crashed writing it.

ROLLBACK/*!*/;

BINLOG '

6D2jTA8BAAAAZgAAAGoAAAABAAQANS4xLjUwLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAADoPaNMEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC

'/*!*/;

# at 106

#100929 21:29:35 server id 1  end_log_pos 134     Intvar

SET INSERT_ID=16/*!*/;

# at 134

#100929 21:29:35 server id 1  end_log_pos 237     Query    thread_id=1    exec_time=0    error_code=0

use test/*!*/;           //这里是test数据库

SET TIMESTAMP=1285766975/*!*/;

SET @@session.pseudo_thread_id=1/*!*/;

SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1/*!*/;

SET @@session.sql_mode=0/*!*/;

SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;

/*!\C utf8 *//*!*/;

SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;

SET @@session.lc_time_names=0/*!*/;

SET @@session.collation_database=DEFAULT/*!*/;

insert into aa(name)values('cccccccccc')

/*!*/;

# at 237

#100929 21:32:21 server id 1  end_log_pos 265     Intvar

SET INSERT_ID=12/*!*/;

# at 265

#100929 21:32:21 server id 1  end_log_pos 370     Query    thread_id=1    exec_time=0    error_code=0

SET TIMESTAMP=1285767141/*!*/;

insert into user(name)values('cccccccccc')

/*!*/;

# at 370

#100929 21:35:25 server id 1  end_log_pos 440     Query    thread_id=1    exec_time=0    error_code=0

SET TIMESTAMP=1285767325/*!*/;

BEGIN

/*!*/;

# at 440

#100929 21:35:25 server id 1  end_log_pos 468     Intvar

SET INSERT_ID=45/*!*/;

# at 468

#100929 21:35:25 server id 1  end_log_pos 573     Query    thread_id=1    exec_time=0    error_code=0

use blog/*!*/;             //这里是blog数据库

SET TIMESTAMP=1285767325/*!*/;

insert into city(CityName)values('asdf')

/*!*/;

# at 573

#100929 21:35:25 server id 1  end_log_pos 600     Xid = 205

COMMIT/*!*/;

DELIMITER ;

# End of log file

ROLLBACK /* added by mysqlbinlog */;

/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

下面还有一个重要索引文件就是mysql-bin.index

[root@BlackGhost mysql]# cat mysql-bin.index

./mysql-bin.000001

./mysql-bin.000002

./mysql-bin.000003

./mysql-bin.000004

./mysql-bin.000005

./mysql-bin.000006

四,增量备份和增量还原

1,增量备份

既然我们知道了,mysql里面新增加的数据在mysql-bin这样的文件里面,我们只要把mysql-bin这样的文件进行备份就可以了。

cp /var/lib/mysql/mysql-bin* /data/mysql_newbak/

2,增量还原,讲几个常用的,比较有用的

a),根据时间来还原–start-date,–stop-date

[root@BlackGhost mysql]# /usr/local/mysql/bin/mysqlbinlog –start-date=”2010-09-29 18:00:00″ –stop-date=”2010-09-29 23:00:00″ /var/lib/mysql/mysql-bin.000002 |mysql -u root -p

根据条件看一下数据

[root@BlackGhost mysql]# /usr/local/mysql/bin/mysqlbinlog  --start-date="2010-09-29 18:00:00"

--stop-date="2010-09-29 23:00:00"  /var/lib/mysql/mysql-bin.000002

//下面是部分内容,其实也就是一些对数据进行操作的sql语句

# at 237

#100929 21:32:21 server id 1  end_log_pos 265     Intvar

SET INSERT_ID=12/*!*/;

# at 265

#100929 21:32:21 server id 1  end_log_pos 370     Query    thread_id=1    exec_time=0    error_code=0

SET TIMESTAMP=1285767141/*!*/;

insert into user(name)values('cccccccccc')

/*!*/;

# at 370

#100929 21:35:25 server id 1  end_log_pos 440     Query    thread_id=1    exec_time=0    error_code=0

SET TIMESTAMP=1285767325/*!*/;

BEGIN

/*!*/;

# at 440

#100929 21:35:25 server id 1  end_log_pos 468     Intvar

SET INSERT_ID=45/*!*/;

# at 468

#100929 21:35:25 server id 1  end_log_pos 573     Query    thread_id=1    exec_time=0    error_code=0

b),根据起始位置来还原,–start-position,–stop-position

[root@BlackGhost mysql]# /usr/local/mysql/bin/mysqlbinlog –start-position=370 –stop-position=440  /var/lib/mysql/mysql-bin.000002 |mysql -u root -p

//查看插入的内容,根a)中是一样的

[root@BlackGhost mysql]# /usr/local/mysql/bin/mysqlbinlog –start-position=370 –stop-position=440  /var/lib/mysql/mysql-bin.000002

–start-position=370 –stop-position=440这里面数字从哪儿来的呢?# at 370

#100929 21:35:25 server id 1  end_log_pos440Query    thread_id=1    exec_time=0    error_code=0

SET TIMESTAMP=1285767325/*!*/;

上面的红色加粗的就是,一个是start-position,一个是stop-position

c),根据数据库名来进行还原-d

在这里是小写的d,请不要把它和mysqldump中的-D搞混了。哈哈。

[root@BlackGhost mysql]# /usr/local/mysql/bin/mysqlbinlog -d test  /var/lib/mysql/mysql-bin.000002

查看内容,请参考a)

d),根据数据库所在IP来分-h

[root@BlackGhost mysql]# /usr/local/mysql/bin/mysqlbinlog -h 192.1681.102  /var/lib/mysql/mysql-bin.000002

查看内容,请参考a)

e),根据数据库所占用的端口来分-P

有的时候,我们的mysql用的不一定是3306端口,注意是大写的P

[root@BlackGhost mysql]# /usr/local/mysql/bin/mysqlbinlog -p 13306  /var/lib/mysql/mysql-bin.000002

查看内容,请参考a)

f),根据数据库serverid来还原–server-id

在数据库的配置文件中,都有一个serverid并且同一集群中serverid是不能相同的。

[root@BlackGhost mysql]# /usr/local/mysql/bin/mysqlbinlog –server-id=1  /var/lib/mysql/mysql-bin.000002

查看内容,请参考a)

注意:上面的几个例子,我都是一个一个说的,其实可以排列组合的。例如

[root@BlackGhost mysql]# /usr/local/mysql/bin/mysqlbinlog –start-position=”2010-09-29 18:00:00″ -d test -h 127.0.0.1 /var/lib/mysql/mysql-bin.000002|mysql -u root -p

五,后续

增量备份的时候,有一点让人不爽,就是mysql-bin这样的文件,每启动一次mysql就会增加一些,如果你不去管他的话,时间长了,他会把你的磁盘占满。

./mysqldump –flush-logs -u root  myblog > /tmp/myblog.sql

备份myblog数据库,清除增量备份里面的有关myblog的数据

./mysqldump –flush-logs -u root  –all-databases > /tmp/alldatabase.sql

备份所有数据库,清除增量备份

mysql-bin.index的起索引作用,因为增量的数据不一定在一个mysql-bin000这样的文件里面,这个时候,我们就要根据mysql-bin.index来找mysql-bin这样的增量文件了。

如果mysql里面做了这样的配置binlog-do-db=test1,增量备份里面只会有test1这个数据库的数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值