如何导入超大mysql数据库备份文件
在mysql中导入/导出超大的sql文本文件,我们可以使用很多方法实例,如有:客户端直接命令操作,分块导入,客户端用source命令操作等等。
创新互联建站坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站制作、成都网站建设、外贸营销网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的上犹网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
在实际工作中,有时经常地时行mysql数据库的导入和导入操作,但对于大型sql文件导入时,phpmyadmin是不行的,有太多限制,比如记录,内存等!
多种方案收集,如下:
方案一:客户端直接命令操作(此方法是我比较喜欢的)
刚恢复一个电商网站mysql备份数据,此备份文件有300多M,因为phpmyadmin支持上传有限,文件太大IE停止响应,所以在本地用
代码如下
复制代码
mysql -u root -p root jiahuibuydb
c:/yebihai.sql
但没导入进去,出来一大堆mysql的参数提示,不认输入的命令参数,后来写成下面这个样子,就是去掉了参数和数据之间的空格
代码如下
复制代码
mysql -uroot -proot jiahuibuydb
c:/yebihai.sql
导入就OK了
导出命令:
a)导出整个库
mysqldump -u 用户名 -p 数据库名 导出的文件名
代码如下
复制代码
mysqldump -u root -p student
d:/yebihai.sql
b)导出一个表
mysqldump -u 用户名 -p 数据库名 表名 导出的文件名
方案二:分块导入
代码如下
复制代码
?
//用来快速Mysql的大数据备份
//使用前请首先按照代码注释修改要导入的SQL文件名、数据库主机名、数据库用户名、密码、数据库名
//同时将数据库文件和本文本一起ftp导网站目录,然后以web方式访问此文件即可
$file_name="sql.sql"; //要导入的SQL文件名
$dbhost="localhost"; //数据库主机名
$dbuser="user"; //数据库用户名
$dbpass="pass"; //数据库密码
$dbname="dbname";
//数据库名
set_time_limit(0); //设置超时时间为0,表示一直执行。当php在safe
mode模式下无效,此时可能会导致导入超时,此时需要分段导入
$fp = @fopen($file_name, "r") or
die("不能打开SQL文件 $file_name");//打开文件
mysql_connect($dbhost, $dbuser,
$dbpass) or die("不能连接数据库 $dbhost");//连接数据库
mysql_select_db($dbname)
or die ("不能打开数据库 $dbname");//打开数据库
mysql_query('set names utf8');
echo "正在执行导入操作";
while($SQL=GetNextSQL()){
if
(!mysql_query($SQL)){
echo
"执行出错:".mysql_error()."
";
echo
"SQL语句为:
".$SQL."
";
};
}
echo
"导入完成";
fclose($fp) or die("Can’t close file $file_name");//关闭文件
mysql_close();
//从文件中逐条取SQL
function GetNextSQL() {
global $fp;
$sql="";
while ($line =
@fgets($fp, 40960)) {
$line =
trim($line);
//以下三句在高版本php中不需要,在部分低版本中也许需要修改
$line =
str_replace("////","//",$line);
$line =
str_replace("/’","’",$line);
$line =
str_replace("//r//n",chr(13).chr(10),$line);
// $line
= stripcslashes($line);
if (strlen($line)1)
{
if ($line[0]=="-" $line[1]=="-")
{
continue;
}
}
$sql.=$line.chr(13).chr(10);
if
(strlen($line)0){
if
($line[strlen($line)-1]==";"){
break;
}
}
}
return $sql;
}
?
方案三:客户端用source命令操作
比较好的办法仍是用mysql的source命令:
一、在客户端下操作:
1、进行入客户端
代码如下
复制代码
2、mysqluse 数据库名(如果没有,先建一个)
3、mysqlset names 'utf8'; (一般看导入的是什么格式的文件)
4、mysqlsource d:/aaa.sql;
即可正常导入,如果有错,可以看出错提示
二、PHP文件操作:
建立a.php
里面有下面内容
代码如下
复制代码
mysql_connet('xxxx');
mysql_query("set names 'utf8'");
mysql_query("source d:/aaa.sql'");
原理同上,主要方便了无法使用命令行用户的操作
方案四:下面教大家一个简单有效的办法,适合不会使用命令窗口的非技术人员,可以导入任意大小的mysql数据库,理论上不论您的数据库备份文件多大,都可以导入
方法如下:
1.将数据库备份文件(如backup.sql)上传至网站根目录。
2.将以下代码保存为mysql.php文件,上传至网站根目录。
代码如下
复制代码
system("mysql -hdbhost -udbuser -ppassword dbname backup.sql");
print "导入成功";
其中
dbhost 改为您的数据库服务器地址(小提示:一般主机默认数据库服务器地址是:localhost)
dbuser 改为您的数据库用户名
password 改为您的数据库用户密码
dbname 改为您的数据库名(导入的时候此库必须先建立好,否则会失败并且不会进行任何提示)
backup.sql表示通过ftp上传到网站根目录下数据库文件的文件名(该文件是解压缩后的文件)
3.在浏览器里面访问mysql.php, 那么就在浏览器里面输入/mysql.php,只要浏览器一访问这个mysql.php文件,数据就开始导入,数据导入结束后,就会显示“导入成功”的字样。这个时间根据您要导入的数据大小决定,一般时间很短
MySQL 常用备份工具流程解析
下面我们就看一下常见的备份工具,以及目前最流行的 Percona XtraBackup 的备份流程。
MySQL 常见的备份工具主要分为三种:
这里先说一下 binlog 备份,它只是把 binlog 又复制了一份,并且需要在逻辑备份或者物理备份的基础上才能进行数据恢复,无法单独进行数据恢复。
mysqldump 备份出的文件就是 sql 文件,其核心就是对每个表执行 select ,然后转化成相应的 insert 语句。mysqldump 的备份流程大致如下:
从上面可以看出在 mysqldump 备份期间,备份到某个数据库时,该数据库下的表都会处于只读状态,无法对表进行任何变更,直到该库下的表备份完毕,这对于线上环境一般是无法接受的。若是指定了--master-data或者 --dump-slave 则会在备份开始时加全局读锁(FLUSH TABLES WITH READ LOCK),直到备份结束。当然我们可以选一个从库进行备份,这样就不会影响线上业务。另外使用 mysqldump 备份还有一个最大的好处,因为备份出来的是 sql 语句,所以它支持跨平台和跨版本的数据迁移或者恢复,这是物理备份无法做到的。
但是也正是因为 mysqldump 备份出来的是 sql 语句,在使用时要更加注意,否则可能会酿成大祸。例如,使用 mysqldump 常见的问题有:
所以使用 mysqldump 时一定要了解各个选项的作用,以及确认备份出来的 sql 文件里会有什么操作,会对现有数据造成什么影响。
Mydumper 原理与 Mysqldump 原理类似,最大的区别是引入了多线程备份,每个备份线程备份一部分表,当然并发粒度可以到行级,达到多线程备份的目的。这里不再单独介绍。
Percona XtraBackup 是 Percona 公司开发的一个用于 MySQL 数据库物理热备的备份工具,是基于 InnoDB 的崩溃恢复功能来实现的。它的基本工作原理如下:
Percona XtraBackup 在进行恢复时会应用拷贝的 redo log ,应用已提交的事务,回滚未提交的事物,将数据库恢复到一致性状态。因为 Percona XtraBackup 备份出来的是物理文件,所以在使用备份出的文件进行恢复或者迁移时,不会像 mysqldump 那样会存在很多问题。
使用 XtraBackup 备份时根据备份参数设置不同,对数据库的变更会造成不同程度的影响,具体影响会在下文分析。
通过对比发现,XtraBackup 具有对数据库影响小,且能快速恢复的优点,在日常备份中是首选;mysqldump 使用相对更加灵活,但是使用是要注意对数据库原有数据的影响。
备份策略主要有:全量备份和增量备份,再加上 binlog 备份。
目前去哪儿网数据库备份主要采用 XtraBackup 全量备份 +binlog 备份。数据库的重要级别不同,全量备份的频率不同。备份程序主要架构如下:
说明:
Percona XtraBackup 是目前备份 MySQL 使用最广泛的工具。在备份过程中,数据库可以进行正常的读写或者其他变更操作,但是偶尔也会遇见备份引起的元数据锁,或提交事务时发现被 binlog lock 阻塞等情况。下面我们就看一下 Percona XtraBackup 的备份流程和加锁时机。
说明:以下对 Percona XtraBackup 的分析都是基于 2.4.23 的版本,其他版本会略有差别,但是关键步骤基本相同。
XtraBackup 在备份开始时,会创建一个后台线程,专门用于拷贝数据库的 redo log 。首先 XtraBackup 会扫描每组 redo log 的头部,找出当前的 checkpoint lsn ,然后从该 lsn 后顺序拷贝所有的 redo log ,包括后续新产生的 redo log 。该线程会一直持续到将非事务表完全拷贝完成,才会安全退出。备份日志输出中会记录拷贝开始时的 checkpoint lsn 。日志输出如下:
在拷贝ibd文件之前,会先扫描数据库的数据文件目录,获取ibdata1,undo tablespaces及所有的ibd文件列表,并会记录相应的 space id,因为在恢复时需要这些 space id来找到对应 doublewrite buffer里页面的内容,以及对应的redo log条目。然后开始循环拷贝ibdata1,undo tablespaces及所有的ibd文件。
这里可通过设置--parallel进行多线程备份,提高物理文件的拷贝效率。不设置则默认为1。
在所有ibd文件拷贝完成后,XtraBackup开始备份非ibd文件。这一部分的逻辑比较复杂,因为备份非ibd文件前需要加锁,具体是否会加锁主要受到--no-lock 参数设置的影响。
若是设置了--no-lock为TRUE,则不会使用"FLUSH TABLES WITH READ LOCK"去加全局读锁,但是若备份过程中对non-InnoDB表执行了DDL或者DML操作, 这会导致备份的不一致,恢复出来的数据就会有问题。所以是不建议将--no-lock为TRUE,默认值是FALSE,也就是在不指定该选项的情况下会在备份非ibd文件前加全局读锁。
下面我们结合源码来看看判断是否加全局锁这部分的具体流程逻辑:
流程图如下:
总结来看:
1)若--no-lock为FALSE(默认值),则先施加全局读锁,然后再进行拷贝文件,另外若 --safe-slave-backup 设置为TRUE ,则会在加全局锁之前关闭SQL_THREAD线程;
2)若--no-lock为TRUE,则不会施加锁,直接进行拷贝文件。
加锁的逻辑主要由lock_tables_maybe实现,先看一下lock_tables_maybe源代码,如下:
lock_tables_maybe 函数简化处理流程如下:
1)若备份实例上已经加锁( LOCK TABLES FOR BACKUP / FLUSH TABLES WITH READ LOCK)或者设置lock-ddl-per-table 则直接返回;
2)若支持备份锁,则执行LOCK TABLES FOR BACKUP;
3)若不支持备份锁,则执行 FLUSH TABLES WITH READ LOCK。根据相应选项设置,在执行该操作前会判断是否有执行中的DDL/DML,以及等待超时时间,是否kill 对应的未结束的事务等。
从上文中我们还看到一个参数--safe-slave-backup ,该参数的主要作用是:
若是在从库执行的备份操作时设置了该参数,可以防止因从库同步主库操作,而导致XtraBackup长时间请求不到锁而造成备份失败。
若是设置了 --safe-slave-backup 为TRUE,那么会执行"STOP SLAVE SQL_THREAD",并等待Slave_open_temp_tables 为零才开始拷贝非 ibd 文件,Slave_open_temp_tables 为零说明SQL thread执行的事务都已经完成,这样就能保证备份的一致性。并且此时也不会有在执行的事务阻塞 XtraBackup 施加全局锁。
备份完非 ibd 文件后,将会备份 slave 和 binlog 信息。
mysql-bin.000004 2004 6b7bda9f-15f0-11ec-ba14-fa163ea367a4:1-83,9841546e-15f0-11ec-9557-fa163e736db4:1
需要注意,在支持备份锁的实例上备份,指定了 --slave-info 或--binlog-info 均会先施加 binlog 备份锁( LOCK BINLOG FOR BACKUP),这会阻塞任何会更改 binlog 位点的操作。
备份完数据库的所有文件和binlog等相关信息,备份工作就基本完成了,之后主要执行的操作如下:
1)执行"FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS",将所有的redo log刷盘;
2)停止redo log复制线程;
3)释放全局读锁(备份锁),binlog锁;
4)开启SQL_THREAD;
5)拷贝ib_buffer_pool和ib_lru_dump文件;
6)生成配置文件backup-my.cnf;
7)打印备份信息到xtrabackup_info文件,这些信息主要包含备份时使用的参数信息,备份起止时间,binlog位点信息,以及将会回到的lsn点。
下面是xtrabackup_info记录的部分内容:
加锁对应的函数是 mdl_lock_tables ,释放锁对应的函数是 mdl_unlock_all,主要是执行COMMIT,结束 mdl_lock_tables 中开启的显式事务,来释放MDL锁。mdl_lock_tables 流程如下:
上面参数--lock-ddl和--lock-ddl-per-table是在 Percona XtraBackup 2.4.8 之后添加的,因为 MySQL 5.7 新增了一个叫做 Sorted Index Builds 的功能,这会导致某些 DDL 操作不记录重做日志而导致备份失败。使用--lock-ddl或--lock-ddl-per-table 就会在备份开始时施加锁,阻止 DDL 操作。
另外,若备份时指定了--lock-ddl或--lock-ddl-per-table,则在备份非 ibd 文件时就不是再有加锁操作。
注意:LOCK TABLES FOR BACKUP和LOCK BINLOG FOR BACKUP 语句只有在支持备份锁的实例上才会执行,Percona Server for MySQL已经在 5.6.16-64.0 版本开始支持这种更加轻量的备份锁。
Q1: 使用 XtraBackup 备份的文件进行恢复时,恢复到哪个时间点? A1:恢复到执行 LOCK BINLOG FOR BACKUP 或 FLUSH TABLES WITH READ LOCK 的时间点,因为这时任何改变 binlog 位点的操作都会被阻塞,redo log和binlog 是一致的。
Q2: 在开启 binlog 的情况下,MySQL 的奔溃恢复是同时依赖 binlog 和 redo log 这两种日志的,为什么XtraBackup 不用备份binlog?
A2:因为在备份中有执行LOCK BINLOG FOR BACKUP/FLUSH TABLES WITH READ LOCK,阻止了任何改变binlog位点的操作,这样只需要根据redo log将有commit log 的事务提交,没有commit log的事务进行回滚即可。
Q3: 使用Percona XtraBackup备份完成后redo的位点是和binlog是一样还是比binlog多一些?
A3:通过分析备份流程可以发现备份 binlog 位点信息(加binlog锁)是发生在停止 redo 拷贝线程前,而释放锁是在停止 redo 拷贝线之后,所以 redo log 会多一些。锁住了 binlog 保证了在该 binlog 位点前已经提交的事务的 redo log 都有 commit log 的信息,未提交的事物也就没有对应的 commit log 的信息,即便在锁住 binlog 后有 Innodb 表新的 DML 产生的 redo log ,但是事务无法提交,也就没有 commit log 的信息的,最后在回放的过程中对没有 commit log 的事务进行回滚就可以了。
Q4:Percona XtraBackup什么时候会加锁,以及影响加锁时间长度的因素有哪些?
A4:上面进行了分析,加锁操作只在备份非 ibd 文件时执行,加锁时长主要和非事务表的数量和大小有关,非事务表的数量越多,体积越大,拷贝文件所用的时间越长,那么加锁时间也就越长。也会和 redo log 生成的速度有关,只是 redo log 刷盘受到多个因素的影响,未及时刷盘的 redo log 一般很小。
Q5:Percona XtraBackup 和mysqldump选择哪个更好?
A5:通过上面的的解析,若是整个实例备份,首先选择 Percona XtraBackup ,因为对数据库的影响最小。若只是备份某个库表,这个就要视数据量而定,若数据量不大可以使用 mysqldump 。注意,对数据库做备份时最好选择业务连接最少的从库,因为备份也会消耗一定的资源,避免影响业务。
mysql大数据库备份什么软件好用?
1. mysqldump: 最早,也是最成熟的逻辑备份工具,是 MySQL 原生的用来备份整个数据库实例、单个数据库、单张表的逻辑备份工具, 上手简单,学习成本几乎为 0。备份简单,恢复也简单。
比如导出单个数据库 ytt: mysqldump ytt /tmp/ytt.sql;
恢复也非常简单:mysql /tmp/ytt.sql
缺点是备份速度慢。在整个备份过程中,是单线程运行;备份出来的数据集要恢复的话同样也是单线程运行,恢复速度也慢。除非对同一时刻的所有表单独备份出来,自己写额外脚本进行多线程恢复。
2. mysqlpump:MySQL 5.7 GA 后推出的 mysqldump工具的增强版。可以对同一个数据集多个线程并发备份,备份速度很快。
其他缺点和 mysqldump 一样。
3. MySQL Shell UTIL 对象附带的备份工具:随 MySQL 8.0.21 最新版本捆绑发布,自带多线程备份以及多线程恢复功能, 可以直接替代 mysqldump/mysqlpump。
dump_instance/dumpInstance 用来多线程备份 MySQL 整个单机实例
dump_schemas/dumpSchemas 用来多线程备份 MySQL 单个数据库
load_dump/loadDump 用来多线程恢复之前两个工具导出的数据集文件
MySQL Shell UTIL 备份恢复工具具备如下特性:
1. 压缩导出(默认压缩算法 zstd)
2. 数据集分块导出,每块 32M
3. 默认导出存储过程、存储函数、触发器、事件、用户、视图
4. 默认 4 个线程导出
5. 默认进度展示
6. 默认字符集 utf8mb4
7. 默认开启一致性导出
8. 默认表,视图等定义导出为 SQL 语句
9. 默认数据导出为 TSV 格式数据
大数据下,mysql怎么做数据库的备份?
把我下面的脚本,写成一个bat文件,进行必要的修改,执行就可以方便备份了。
@echo off
echo.
echo MySQL数据库备份
echo *****************************
echo.
echo 今天是 %date%
echo 时间是 %time%
echo.
echo *****************************
set "Ymd=%date:~,4%%date:~5,2%%date:~8,2%"
md "D:\%Ymd%"
"C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqldump" --opt -Q -uroot -proot --default-character-set=gbk mysql "D:\%Ymd%\mySQLteble.sql"
echo.
echo MySQL数据库备份完成,请进行检查。。。
echo.
echo.
pause
MySQL的备份与还原,非常规备份,全量备份,增量备份
1:官方百万级别的测试数据库:
官方测试数据库github网址:
下载到目录,解压即可,运行命令:
2:自己创建简单测试数据库:
快速随机生成测试语言的网站:
选择sql和想生成的字段,点击生成Generate!生成即可。
在MySQL输入生成的语句即可。
3:测试备份还原时用到的命令
删库跑路测试(先备份好)
还原后查询库的表数据是否完整。
采用复制整个数据存放目录
1:查看数据库数据存放位置
有两种方法:
1):在数据库中用命令 show variables like 'datadir'; 查看
2):在配置文件中查看,配置了 datadir 目录的可查看。没有配置的默认为 /var/lib/mysql/ 位置
Linux中查看配置文件
2:复制目录或者目录下某个数据库名
3:还原时直接复制文件夹到数据库目录即可
mysqldump又可叫做全量备份。
参数 --databases 同 -B ,单独一个库,也可省略。
1、备份命令mysqldump格式
格式:mysqldump -h主机名 -P端口 -u用户名 -p密码 database 数据库名 文件名.sql
备份testDatabase数据库
2、备份MySQL数据库为带删除表的格式
备份MySQL数据库为带删除表的格式,能够让该备份覆盖已有数据库而不需要手动删除原有数据库。
3、直接将MySQL数据库压缩备份
备份并压缩
4、备份MySQL数据库某个(些)表
备份testDatabase中的myTable表,不需要用参数 --databases 或者 -B
5、同时备份多个MySQL数据库
同时备份testDatabase和 employees两个库
6、备份服务器上所有数据库
参数 --all-databases 同 -A
7、还原MySQL数据库的命令
1) 不指定数据名还原,默认生成原数据库名称,还原所有数据库。
2) 指定数据名还原,还原指定单个数据库,需在数据库种预先创建一个testDatabase名称。
3) 还原压缩的MySQL数据库
4) 进入数据库用source导入
增量备份是针对于数据库的bin-log日志进行备份的,增量备份是在全量的基础上进行操作的。增量备份主要是靠mysql记录的bin-log日志。
1:查看是否开启bin-log日志
进入mysql输入命令可查看。
显示如下为开启状态,日志文件在/var/lib/mysql/以binlog.00001的格式保存。
如未开启,需要在配置文件种配置
2:查看目前使用的bin-log日志文件
进入mysql查看命令。
显示如下,目前使用的是binlog.000022文件,所有操作都记录在此文件。
查看当前testDatabase的表myTable数据如下,
3:刷新日志,使用新的日志文件(备份)
在命令端执行命令
日志文件从 binlog.000022 变为 binlog.000023
这时相当与已经备份成功,备份文件即为上次的binlog.000022日志文件。
4:删除数量,从日志还原数据
1) 删除ABC行
查询以及没有ABC行列。
2) 恢复数据ABC行
退出mysql,在命令端用mysqlbinlog命令恢复到binlog.000022日志状态。
进入数据库再次查看数据,ABC已经恢复。
增量备份完成。
mysql 大数据量备份方式
1 .一般用mysqldump
2. 增量的可以直接用tar 命令备份
3.对于你这个问题.最好配置个mysql主从..一台坏了.另一台可以工作.就可以不需要经常备份了.
分享名称:mysql太大怎么备份,数据库备份文件太大
本文URL:http://lswzjz.com/article/hdeoio.html