php实现mysql数据库分表分段备份

php实现mysql数据库分表分段备份,第1张

分卷导出思路:统计sql语句变量的长度,按1个字符当成1

字节比较,如果大于设定分卷大小,则写入一个sql文件(我也不知道这样统计是否稳当,这也是借鉴其他的人的)。

分卷导入思路:按行读取sql文件,将每一行当作完整的sql语句存到数组再循环执行插入数据就可以了,但是在创建表语句分了多行,这个需要单独处理(就这个花了我好长时间的);

<php

//宋正河

转载请注明出处

set_time_limit(0);

header('content-type:text/html;charset=utf-8');

mysql_connect('localhost','root','root');

mysql_select_db('test');

$table_array=get_tables('test');

mysql_query('set

names

utf8');

$filesize=102410244;

$start=$_GET['start']$_GET['start']:0;

$part=$_GET['part']$_GET['part']:'1';

$table_index=$_GET['table_index']$_GET['table_index']:'0';

$table=$table_array[$table_index];

$num=200000000;//这个数要足够大,可以是总记录数

$backupdata='';

if($start=='0'){

$query="SHOW

CREATE

TABLE

`{$table}`";

$result

=

mysql_query($query);

$row

=

mysql_fetch_row($result);

$backupdata

=

"DROP

TABLE

IF

EXISTS

`{$table}`;\n"

$row[1]

";\n\n";

}

$limit=($start=='0')'':"

limit

$start,$num

";

$query="select

from

`{$table}`

$limit

";

$result=mysql_query($query);

$numfields

=

mysql_num_fields($result);

//统计字段数

while($row=mysql_fetch_row($result)){

$comma

=

'';

//存储逗号

$backupdata_tmp

=

"INSERT

INTO

`{$table}`

VALUES

(";

for($i=0;

$i<$numfields;

$i++){

$backupdata_tmp

=

$comma

"'"

mysql_escape_string($row[$i])

"'";

$comma

=

',';

}

$backupdata_tmp

=

");\n";

if(strlen($backupdata)+strlen($backupdata_tmp)

>

$filesize){

//写入文件并跳转

$file='data/'$table'-'$part'sql';

file_put_contents($file,$backupdata);

echo

$file'

备份完成,程序继续进行!';

$part++;

//分段

//表名

//起点

//跳转

sleep(3);

echo

"<script>locationhref='start={$start}&table_index={$table_index}&part={$part}';</script>";

exit;

}

$backupdata=$backupdata_tmp;

$start++;

}

if($backupdata){

$file='data/'$table'-'$part'sql';

file_put_contents($file,$backupdata);

}

echo

$table'备份完成!<br

/>';

sleep(2);

$table_index++;

if($table_array[$table_index]){

echo

"<script>locationhref='table_index={$table_index}';</script>";

exit;

}else{

echo

'恭喜你,数据库备份完毕!';

}

function

get_tables($db){

$tq

=

mysql_list_tables($db);

while($tr

=

mysql_fetch_row($tq)){

$arrtb[]

=

$tr[0];

}

return

$arrtb;

}

>

以上所述就是本文的全部内容了,希望大家能够喜欢。

用以备份的工具

1

mysqldump

2

mysqlhotcopy

3mysqlsnapshot

4ibbackup

联机备份

VS

脱机备份

联机备份通常使用在不能接受数据库停机的情况下,一般来说,脱机备份速度快,并且发生错误的几率少,我们不用担心数据库正在执行事务,锁表等容易发生一致性问题的发生。如果你幸运的可以停下数据库或者有一个主从方式的数据库,请使用脱机方式备份。

Data

Dump

vs

Raw

backups

Data

dump

输出一系列SQL

语句序列,可以在后来用来重新创建数据库的结构并恢复数据。mysqldump

是这个领域的首选工具,他可以用在任意类型的表上面,无论是本地的还是网络的。当然,由于要产生很多额外的SQL语句,导出结果将是一个很大的文件并且占用很多CPU资源,最重要的是,当数据恢复后需要一次完全的索引重建。

更有效率的方法是是对MySQL数据库的物理文件做一次快照(snapshot)。因为我们跳过了很多转化步骤,因此处理起来比较高效。

做一个MyISM数据表的备份只要拷贝磁盘上数据文件和索引文件。对InnoDB,需要备份对应表空间和关联的事务日志。

mysqldump

/

mysqlhotcopy

/

mysqlsnapshot

/

ibbackup

mysqldump

-

(online,

dump)

-

最一般的工具,他会通过锁表的方式从一个联机数据库中做数据导出并写到指定的文件中(磁盘或网络上)。他只适合小的数据库。

#

typical

mysql

dump

backup

and

restore

usage

mysqldump

-u

root

-pPassword

-x

–all-databases

>

db_dumpsql

mysql

-u

root

-pPassword

<

db_dumpsql

#

dump

into

‘backup’

folder

(local

machine),

into

two

text

files

<data,

table_structure>

mysqldump

-T

backup

–fields-terminated-by=’,’

database-name

-u

root

-pPassword

#

compress

the

dumped

data

on

the

fly

mysqldump

-u

root

-pPassword

–all-databases

|

bzip2

-c

>

db_dumpbz2

mysqlhotcopy

-

(online,

raw)

将对由

ISAM或MyISAM

表构成的数据库做一个完全的物理备份。他的 *** 作方式:对所有表获取一个只读锁=>做文件拷贝=>释放锁。

#

perform

an

online

backup

into

/backup/location

mysqlhotcopy

-u

root

-p

password

database_name

/backup/location

mysqlsnapshot

-

(online,

raw)

一个非常好的工具用来在联机方式下获得MySQL数据库的一个快照。可以配置它来压缩数据,并/或

为每一个数据库提供一个分离的tar文件。

不过他只适合

MyISAM

类型数据库。

#

save

a

full

database

snapshot

of

an

online

database

into

/backup/location

mysqlsnapshot

-u

root

-pPassword

-s

/backup/location

#

restore

a

snapshot

tar

-xvf

/backup/location/dbtar

ibbackup

-

(online,

raw)

可以对使用InnoDB和MyISAM表的任何数据库做联机备份。是一个很好的工具就是要收费当然如果你是一个InnoDB的用户,还是值得花钱购买的。

#

perform

online

backup

of

MyISAM

/

InnoDB

tables

ibbackup

/etc/mycnf

/etc/ibbackupcnf

#

restore

recent

backup

(as

configured

in

ibbackupcnf)

ibbackup

–restore

/etc/ibbackupcnf

cp,

scp,

nc

-

(offline,

raw)

如果你可以停下数据库,则可以使用这几个工具直接拷贝数据库目录下的文件。是获取数据库快照的最安全方法。

一、数据备份的重要性

工作中,如果意外删除了重要的文件或者目录的话,那结果可就惨了。尤其是当误删除的数据涉及重要的客户或者关键项目,并且这些数据无法轻易重新创建的时候,那滋味,不用我说你也能想象得到。不巧的是,像这样的数据在公司环境中随处可见,例如销售记录、客户****,等等。

二、关于mysqldump

MySQL自身提供了许多命令行工具,例如mysql工具可以用来与MySQL的数据库模式、数据、用户和配置变量进行交互,而mysqladmin工具则可以进行各种管理任务,还有就是下面将要介绍的mysqldump。此外还有很多,不过那超出了本文的讨论范围。工具mysqldump既可以用来备份数据库模式,还可以用来备份数据;利用它,我们不仅可以对一个服务器上的所有数据库进行地毯式的备份,同时我们还可以选择性地备份某个数据库,甚至数据库中指定的某些表。

当在服务器上安装MySQL的时候,应修改系统路径以便使全局命令行可以访问各个客户程序。打开终端窗口,并执行下列命令:%>mysqldump Usage: mysqldump [OPTIONS] database [tables] OR mysqldump [OPTIONS]

databases [OPTIONS] DB1 [DB2 DB3] OR mysqldump [OPTIONS] all-databases [OPTIONS]

For more options, use mysqldump help

这里给出了使用mysqldump程序的方法。举例来说,若要备份所有数据库模式和数据至文件backup092210sql的话,可以执行如下所示的命令:%>mysqldump -u root -p all-databases > backup092210sql Enter password:

这里,为了能够访问所有数据库,我们需要一个root权限,所以这里需要在提示符后面输入相应口令。此外,如果你是在开发用的服务器上练习这些命令的话,不妨花一些时间看看备份文件的内容。这时您会看到一系列的SQL语句,先是删除各个表后重新创建的语句,然后是重新创建相关数据的语句。另外,由于上面的例子中我们对所有数据库进行备份,所以您还会发现,备份文件将创建每个数据库(如果它还没有存在的话),然后通过USE命令切换到该数据库,进而创建与该数据库相关的表跟数据。

若要备份单个数据库,例如要备份名为wiki的数据库到一个名为wiki-backup092210sql的文件中,我们可以使用如下所示的命令:%>mysqldump -u root -p wiki > wiki-backup092210sql Enter password:

最后,若要备份数据库中名为users的表的话,例如要把它备份到名为wikiusers-backup092210sql的文件中,我们可以使用如下所示的命令:%>mysqldump -u root -p wiki users > wikiusers-backup092210sql Enter password:

三、调整备份内容

有时候,我们可能只想备份数据库的模式,或者只想备份数据库的数据。为了备份数据库模式,可以向mysqldump传递参数no-data,如下所示:%>mysqldump -u root -p no-data wiki > wiki-backup092210sql

为了只备份数据库的数据,可以向mysqldump使用参数no-create-info,如下所示:%>mysqldump -u root -p no-create-info wiki > wiki-backup092210sql

对于前面所举的例子,仅需要少量的击键次数就能执行mysqldump命令。然而,工作中要干的活还有很多,并且如果老是执行这些命令的话,那么生活就会变得太单调了。因此,我们可以设法使这些过程自动化,这时我们可以借助cron工具来达成我们的目标,这个工具在所有类UNIX *** 作系统上都能找到。为了自动执行备份任务,我们需要新建一个正确命名的文件。例如nightly-backupsh,具体命令如下所示:#!/bin/sh mysqldump -uroot -psecret wiki > /home/backup/sql/wiki-backup-`date +%m%d%Y`sql

接下来,我们将这个脚本提供交给cron,方法是使用crontab。为此,我们可以执行如下所示的命令:%>crontab -e

这将打开当前登录用户的crontab文件,如果该文件不存在的话就会自动新建一个。在这个文件中,我们可以添加如下内容,来确保每天上午3时运行该备份脚本:0 3 /home/backup/scripts/nightly-backupsh

如果您对crontab的语法很陌生的话,这里的参数可能让您摸不着头脑。这里前五个参数分别对应于执行脚本的时间,依次为分、时、日、月和星期几。因此,要想在每星期二的4:45am执行脚本的话,可以使用参数45 4 3。

插入上面所示的一行内容后,保存文件,那么我们的任务就会开始按照给定时间调度执行。 需要注意的是,第二天早上一定要查看相应的目录,看看事情是否一切正常。

五、其它备份方案

就像本文前面所说的那样,mysqldump只是MySQL众多备份方案中的一个。此外,您还可以使用MySQL的二进制日志文件进行增量备份,或者使用从MySQL主服务器中将数据复制到从服务器中。

六、小结本文中,我们与读者一道建立了一个简单的MySQL备份解决方案。如果您之前还未实施任何解决方案的话,不妨立即动手试一下。重要的是,这只需要花费您几分钟的时间,我想这是很划得来的。

主库的主机关机时,数据只能读不能写,并且从库的主机关机后,数据仍然可读可写,这个不好弄,如果你对lua脚本有所了解,修改mysql-proxy 的读写分离脚本或许可以实现。

不过主库关机时不能访问,并且从库关机仍可读可写,这个不需要配读写分离,这本来就是主从复制的基本能力,从库只是备用的而已。从库关闭后再开启,slave IO线程会自动从中断处二进制日志的位置开始复制主机的二进制日志,slave SQL线程会读取并执行这些二进制日志中的SQL。

总之,不需要特别的配置,这是主从复制的基本能力。

当然是DRDB。

对于MySQL数据库来说,从比较早的版本开始,MySQL就支持master-slave复制,这个特性是MySQL数据库非常重要,而且也应用比较广泛的特性。MySQL复制在读写分离,数据备份,可伸缩性等方面都有比较好的应用,并结合其他特性,也很容易实现高可用性。

DRBD也是官方推荐的可用于MySQL高可用方案之一,软件功能强大,数据可在底层快设备级别跨物理主机镜像,且可根据性能和可靠性要求配置不同级别的同步。IO *** 作保持顺序,可满足数据库对数据一致性的苛刻要求。

但非分布式文件系统环境无法支持镜像数据同时可见,性能和可靠性两者相互矛盾,无法适用于性能和可靠性要求都比较苛刻的环境,维护成本高于MySQL Replication。

常规架构--Master-slaves,是由一个Master到一个或多个Salve的架构模式,主要用于读压力大的应用数据库端廉价扩展解决方案,读写分离,Master主要负责写方面的压力。

以mysql为列:

规划容灾备份时,有两个参考依据,1:恢复点目标(PRO),2:恢复时间目标(RTO)。他们定义了可以容忍丢失多少数据,以及恢复数据需要多少时间。而且一定要走出一个误区,复制就是备份,只有备份才能满足备份的要求。

个人认为备份方案类型如下:

1:在线备份或者离线备份,通常关闭mysql做离线备份是最简单最安全的,服务器不提供应用访问服务,可以更快完成备份,但是,这样会导致服务中断,同时,重启mysql也需要一定的时间成本,对于已经上线的系统,基本不可取。在线备份的最大一个问题是,mysql可能锁住大量的表,除非锁被释放,否则会有大量的io请求被阻塞。

综上所述,我们在规划备份的时候需要考虑一下几点:

a:锁时间。

b:备份时间。

c:备份负载对服务器的影响有多大。

d:恢复备份时间需要多久。

2:逻辑备份还是物理备份。

(1):逻辑备份有以下优点:

a:逻辑备份文件恢复非常简单。只需要使用mysqlimport即可。

b:在我们只想查看数据,不想恢复的时候可以使用grep或者sed命令查看。

c:逻辑备份与存储引擎没有关系,我们可以跨存储引擎恢复数据,比如:从InnoDB表中备份,用很小的工作量就可以把数据恢复到MyISAM中。

逻辑备份也会有以下缺点:

a:必须有数据库服务器完成备份工作,增加服务器工作负荷。

b:逻辑备份文件某些场景比数据库本身文件还大。

c:无法保证导入导出的数据是一样的,比如浮点型数据。

d:恢复的时候需要重建索引,速度会慢。

(2):物理备份有以下优点:

a:基于文件的物理备份,只需要复制 *** 作到目标目录即可。

b:恢复的时候只需要将文件copy到要恢复的目录即可。InnoDB可能需要停止服务和其他一些 *** 作。

c:物理备份中恢复速度块,而且容易垮平台和 *** 作系统和mysql数据库版本。

物理备份也会有以下缺点:

a:文件名大小写敏感,浮点格式数据可能会遇到麻烦。

b:物理备份通常包含很多未使用的空间。

3:增量备份和差异备份。增量备份和差异备份只是局部备份,主要是思想就是不备份没有改变的表,但是会减少服务器的开销,备份时间等。

4:二进制日志备份。通常数据小,我们可以频繁的备份,同时,基于时间点的恢复,二进制日志备份是一个很有效的手段。

5:文件系统快照,通过创建镜像达到恢复的目的。

对于一个好的开发人员来说,有好的备份容灾规划和计划是必不可少的。这样可以提高我们在线系统的持续运行能力。更好的服务我们系统的用户。我个人最喜欢的备份方式就是从文件系统快照中直接复制数据文件。

以上是个人的见解,希望对你有一定的帮助。谢谢。

以上就是关于php实现mysql数据库分表分段备份全部的内容,包括:php实现mysql数据库分表分段备份、unix下mysql数据库如何利用工具进行数据备份、如何利用mysqldump备份MySQL数据库等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9649115.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存