27.备份与恢复
27.1 备份/恢复策略
考虑因素:
备份表的存储引擎(事务性or非事务性);
全备份or增量备份
用复制做异地备份
定期备份,考虑恢复时间
确保mysql打开log-bin,有了BINLOG,Mysql才可以在必要的时候做完整恢复,或基于时间点的恢复,或基于位置的恢复
经常做备份恢复测试,确保备份的有效性。
27.2 逻辑备份和恢复
优点:对于各种存储引擎都可以用同样的方法来备份。
缺点:速度慢,不适合比较大的数据库。
27.2.1 备份
将数据库中的数据备份为一个文本文件,备份的文件可以被查看和编辑。
备份工具:mysqldump
备份方式:
备份指定的表:mysqldump [options] db_name [tables] > table_name.sql
备份指定的库:mysqldump [options] db_name > db_name.sql
备份所有的库:mysqldump [options] --all-database > all.sql
备份所有的库语法:
mysqldump -u root -proot --all > C:\db_file\all.sql ???
备份scott库语法:
mysqldump -u root -proot scott > C:\db_file\scott.sql
备份scott库和world库语法:
mysqldump -u root -proot ---database scott world > C:\db_file\scott_world.sql ???
备份scott库下的dept表语法:
mysqldump -u root -proot scott dept > C:\db_file\dept.sql
备份scott库下的dept表和emp表语法:
mysqldump -u root -proot scott dept emp > C:\db_file\dept_emp.sql
例子:
-- 测试
mysqldump -h 192.168.7.245 -P 25006 -u root -puniGroup-321 zgai_db company > E:\db_file\company.sql
mysqldump -h 192.168.7.245 -P 25006 -u root -puniGroup-321 zgai_db LC_MainSHListNew > E:\db_file\LC_MainSHListNew.sql
-- 正式
mysqldump -h 192.168.7.245 -P 25006 -u root -puniGroup-321 zgai_db AI_company_info AI_com_id AI_conpany_augment AI_const AI_leader_info AI_leader_info_old AI_pes_id AI_shareholder_info AI_shareholder_j_info AI_shareholder_p AI_shareholder_p_info AI_trade_date > E:\db_file\AI.sql
mysqldump -h 192.168.7.245 -P 25006 -u root -puniGroup-321 zgai_db company company_A_stock company_shareholder company_S_temp fundp_S_temp fund_product fund_product_shareholder person person_leader person_shareholder person_S_temp > E:\db_file\KG_node.sql
mysqldump -h 192.168.7.245 -P 25006 -u root -puniGroup-321 zgai_db shareholding shareholding_company_temp shareholding_person_temp shareholding_fundp_temp Tenure Tenure_temp > E:\db_file\KG_relation.sql
mysqldump -h 192.168.7.245 -P 25006 -u root -puniGroup-321 zgai_db today_all area_classified user_info search_log > E:\db_file\Wangqingxia.sql
mysqldump -h 192.168.7.245 -P 25006 -u root -puniGroup-321 zgai_db com_mainfinaindexnas_temp COM_QMainFinaDataNAS > E:\db_file\Liubowen.sql
mysqldump -h 192.168.7.245 -P 25006 -u root -puniGroup-321 zgai_db EPS_PETTM > E:\db_file\Zhangyanchao.sql
mysqldump -h 192.168.7.245 -P 25006 -u root -puniGroup-321 zgai_db error_log execute_log jydb_Incremental map_jy_hk SecuMain > E:\db_file\Common.sql
mysqldump -h 192.168.7.245 -P 25006 -u root -puniGroup-321 zgai_db LC_MainSHListNew > E:\db_file\LC_MainSHListNew.sql
mysqldump -h 192.168.7.245 -P 25006 -u root -puniGroup-321 zgai_db NI_NewsInfo > E:\db_file\NI_NewsInfo.sql
mysqldump -h 192.168.7.245 -P 25006 -u root -puniGroup-321 zgai_db LC_TextAnnounce > E:\db_file\LC_TextAnnounce.sql
导出选项设置:
--extended-insert 默认,使用批量导入,每行1M
--skip-extended-insert 使用单行导入
系统参数
show VARIABLES like '%autocommit%'; --自动提交设置
27.2.2 完全恢复
将备份文件作为输入执行即可。
mysql [options] db_name < backfile
例子:
-- 测试
mysql -h stage-mysql.c5immry9azen.rds.cn-north-1.amazonaws.com.cn -P 3306 -u stageprisvq7zv5l -paeP5high70fd3lgc --default-character-set=utf8 zgai_db < E:\db_file\company.sql
-- 正式
mysql -h stage-mysql.c5immry9azen.rds.cn-north-1.amazonaws.com.cn -P 3306 -u stageprisvq7zv5l -paeP5high70fd3lgc --default-character-set=utf8 zgai_db < E:\db_file\AI.sql
mysql -h stage-mysql.c5immry9azen.rds.cn-north-1.amazonaws.com.cn -P 3306 -u stageprisvq7zv5l -paeP5high70fd3lgc --default-character-set=utf8 zgai_db < E:\db_file\KG_node.sql
mysql -h stage-mysql.c5immry9azen.rds.cn-north-1.amazonaws.com.cn -P 3306 -u stageprisvq7zv5l -paeP5high70fd3lgc --default-character-set=utf8 zgai_db < E:\db_file\KG_relation.sql
mysql -h stage-mysql.c5immry9azen.rds.cn-north-1.amazonaws.com.cn -P 3306 -u stageprisvq7zv5l -paeP5high70fd3lgc --default-character-set=utf8 zgai_db < E:\db_file\Wangqingxia.sql
mysql -h stage-mysql.c5immry9azen.rds.cn-north-1.amazonaws.com.cn -P 3306 -u stageprisvq7zv5l -paeP5high70fd3lgc --default-character-set=utf8 zgai_db < E:\db_file\Liubowen.sql
mysql -h stage-mysql.c5immry9azen.rds.cn-north-1.amazonaws.com.cn -P 3306 -u stageprisvq7zv5l -paeP5high70fd3lgc --default-character-set=utf8 zgai_db < E:\db_file\Zhangyanchao.sql
mysql -h stage-mysql.c5immry9azen.rds.cn-north-1.amazonaws.com.cn -P 3306 -u stageprisvq7zv5l -paeP5high70fd3lgc --default-character-set=utf8 zgai_db < E:\db_file\Common.sql
mysql -h stage-mysql.c5immry9azen.rds.cn-north-1.amazonaws.com.cn -P 3306 -u stageprisvq7zv5l -paeP5high70fd3lgc --default-character-set=utf8 zgai_db < E:\db_file\LC_MainSHListNew.sql
mysql -h stage-mysql.c5immry9azen.rds.cn-north-1.amazonaws.com.cn -P 3306 -u stageprisvq7zv5l -paeP5high70fd3lgc --default-character-set=utf8 zgai_db < E:\db_file\NI_NewsInfo.sql
mysql -h stage-mysql.c5immry9azen.rds.cn-north-1.amazonaws.com.cn -P 3306 -u stageprisvq7zv5l -paeP5high70fd3lgc --default-character-set=utf8 zgai_db < E:\db_file\LC_TextAnnounce.sql
增加字符集设置可以减少导入过程中的报错。
导入相关系统参数如下:
max_allowed_packet
mysql根据max_allowed_packet参数会限制server接受的数据包大小,有时候大的插入和更新会被max_allowed_packet 参数限制掉,导致失败。
slave_max_allowed_packet
这个新参数将在5.1.64, 5.5.26和5.6.6版本里生效,为从服务器(IO线程)设定一个和max_allowed_packet不同的限制 . 现在从服务器端最大的数据包大小由这个参数决定,而不是max_allowed_packet.
目的是为了缓解复制大的read_buffer_size是被中断的BUG。这个BUG没有被修复,但是现在有了一个官方解决方案,使用一个新的配置参数去缓解这个问题。
net_buffer_length
每个客户端连接时,用于维持连接缓冲,初始分配预设值,在有需要时,则会自动扩大到max_allowed_packet大小,然后在回收预设的net_buffer_length大小 最小1k 最大1m默认16k
Mysqldump时每个extended insert行长度不能超过net-buffer-length的值。
注意:
备份文件恢复后还需要恢复备份后执行的日志文件(binlog)。
mysqlbinlog binlog-file | mysql -u root -p***
完整备份恢复例子:
0)启用BINLOG
set gloable log-bin=1;
1)备份数据库
mysqldump -uroot-ppassword -l -F test>test.dmp
-l选项指给所有表增加读锁。
-F选项指新生成一个二进制日志文件。
2)插入新数据
备份完成后插入新的数据
insert into ...,
然后模拟数据库故障,数据文件损坏。
3)恢复数据库
mysql -uroot -ppassword test<test.dmp
4)恢复BINLOG
mysqlbinlog localhost-bin.000xxx | mysql -uroot -ppassword test
27.2.3 基于时间点恢复
不完全恢复指跳过部分语句(误操作语句)的恢复。
不完全恢复分为基于时间点恢复和基于位置恢复两种。
例子:跳过10点整1分钟的SQL语句
mysqlbinlog --stop-date="2019-01-01 10:00:00" localhost-bin.000xxx | mysql -uroot -ppassword test
mysqlbinlog --start-date="2019-01-01 10:01:00" localhost-bin.000xxx | mysql -uroot -ppassword test
27.2.4 基于位置恢复
将某个时间段内的binlog转储为文本文件:
mysqlbinlog --start-date="2019-01-01 10:00:00" --stop-date="2019-01-01 10:05:00" localhost-bin.000xxx > restore.sql
找到误操作语句前后的position,分别按照前后position恢复。
mysqlbinlog --stop-position=123456 localhost-bin.000xxx | mysql -uroot -ppassword test
mysqlbinlog --start-position=123460 localhost-bin.000xxx | mysql -uroot -ppassword test
27.3 物理备份和恢复
物理备份分为冷备份和热备份。
物理备份基于文件拷贝,优点是速度快,缺点是不同存储引擎方法不同。
27.3.1 冷备份
冷备份指停掉数据库服务,拷贝数据文件和日志文件到备份目录下。
冷备份适用于InnoDB引擎和MyISAM引擎。
冷备份优点是速度快,缺点是停数据库。
冷备份恢复时也需要停掉数据库服务,用备份文件覆盖数据文件和日志文件,再启动数据库并恢复上次备份后的binlog。
27.3.2 热备份
热备份指在不停止数据库服务时拷贝数据文件。
1.热备份MyISAM
给需要备份的表加读锁,再拷贝数据文件到备份目录下。
1.1 使用mysqlhotcopy工具
#>mysqlhotcopy db_name [/path/to/new_directory]
1.2 手动锁表+copy
mysql>flush tables for read;
#>cp 数据文件 [/path/to/new_directory]
2.热备份InnoDB
ibbackup工具(收费,免费使用1个月),
2.1 备份步骤如下:
参照my.cnf编辑backup-my.cnf,参数包括:
datadir=/home/mysql/data datadir=/home/mysql/backup
innodb_data_home_dir=/home/mysql/data innodb_data_home_dir=/home/mysql/backup
innodb_log_group_home_dir=/home/mysql/data innodb_log_group_home_dir=/home/mysql/backup
备份命令:ibbackup my.cnf backup-my.cnf 需要保证备份目录下没有同名的文件。
备份目录下生成了所有的数据文件和日志文件。
生成的日志文件中记录了备份过程中数据库的操作,用于保证恢复的完整性和一致性。
2.2 恢复步骤如下:
进行日志重做
ibbackup --apply-log backup-my.cnf
恢复后重启数据库服务
./bin/mysqld_saft --defaults-file=backup-my.cnf &
再用binlog恢复备份点到故障点的数据
mysqlbinlog localhost-bin.000xxx | mysql -uroot -ppassword test
3.innobackupex工具备份恢复原理
3.1 全量备份
首先开启一个后台检测进程,实施检测mysql redo的变化,发现有redo写入时,将redo同时写入xtrabackup_log中;
复制InnoDB的数据文件和系统表空间文件ibdata1;
复制结束后增加读锁防止执行DDL操作,执行flush tables with read lock;
复制.frm、.MYI、.MYD等文件;
获取binlog的位置;
释放锁,unlock tables;
停止xtrabackup_log。
3.2 全量恢复
用备份文件覆盖数据文件,并执行xtrabackup_log文件。
3.3 增量备份
增量备份即只拷贝有变更的数据块,通过页上的LSN和xtrabackup_checkpoint中给定的LSN比较,确定块是否有更新。
全量备份第二步时(复制InnoDB的数据文件和系统表空间文件ibdata1;)只拷贝有变更的块。
3.4 增量恢复
恢复全量数据,恢复增量数据,恢复xtrabackup_log,恢复binlog,回滚未提交的数据。
4.innobackupex工具备份恢复示例
4.1 innobackupex下载安装
从http://www.percona.com下载和安装Percona XtraBackup软件:
wget -c http://www.percona.com/redir/downloads/XtraBackup-2.1.2/binary/Linux/x86_64/percona-xtrabackup-2.1.2-611.tar.gz
tar xvzf percona-xtrabackup-2.1.2-611.tar.gz
cd percona-xtrabackup-2.1.2
mv percona-xtrabackup-2.1.2 /usr/local/xtrabackup
export PATH=/usr/local/xtrabackup/bin/:$PATH
4.2 全量备份及恢复
创建备份用户并授权
mysql> create user 'backup'@'%' identified by '123456';
mysql> grant reload,lock tables,replication client,create tablespace,super on *.* to 'backup'@'%';
规划好备份路径为mkdir -p /data/backup/hotbackup/
创建innobackupex的配置文件/tmp/my.cnf,内容如下:
[mysqld]
datadir="/home/mysql_test/mysqlhome/data"
innodb_data_home_dir="/home/mysql_test/mysqlhome/data1"
innodb_data_file_path="ibdata1:10M:autoextend"
innodb_log_group_home_dir="/home/mysql_test/mysqlhome/data"
innodb_log_files_in_group=2
innodb_log_file_size=536870912
创建测试表
mysql> create table test(id int auto_increment not null primary key,name varchar(20));
mysql> insert into test (name) values ('test1');
mysql> insert into test (name) values ('test2');
mysql> insert into test (name) values ('test3');
mysql> insert into test (name) values ('test4');
进行全量备份
innobackupex --user=backup --password=123456 --socket=/tmp/mysql_test.sock --defaults-file=/tmp/my.cnf /data/backup/hotbackup/full --no-timestamp
恢复全量备份
innobackupex --apply-log --use-memory=20G /data/backup/hotbackup/full
恢复备份到MySQL的数据文件目录:先关闭MySQL,重命名原数据文件目录,再创建新的数据文件目录,将备份数据复制到新的目录下,授权,启动MySQL。
mysqladmin -S /tmp/mysql_test.sock shut
mv /home/mysql_test/mysqlhome/data /home/mysql_test/mysqlhome/data_bak
mkdir /home/mysql_test/mysqlhome/data
innobackupex --defaults-file=/tmp/my.cnf --copy-back --rsync /data/backup/hotbackup/full/
chown -R mysql:test:mysql_test /home/mysql_test/mysqlhome/data
cd /home/mysql_test/mysqlhome
./bin/mysql_safe -user=mysql &
检验恢复后数据库的一致性,即通过test表的数据检查:
mysql> select * from test;
4.3 增量备份
第一次增量备份是基于全备的,之后的增量备份基于上一次的增量备份。
先进行一次全量备份:
innobackupex --user=backup --password=123456 --socket=/tmp/mysql_test.sock --defaults-file=/tmp/my.cnf /data/backup/hotbackup/full --no-timestamp
增加数据
mysql> insert into test (name) values ('test5');
mysql> insert into test (name) values ('test6');
第一次增量备份基于全备
innobackupex --user=backup --password=123456 --socket=/tmp/mysql_test.sock --defaults-file=/tmp/my.cnf
--incremental /data/backup/hotbackup/incremental_1 --incremental-basedir=/data/backup/hotbackup/full --no-timestamp --parallel=2
再增加数据
mysql> insert into test (name) values ('test7');
mysql> insert into test (name) values ('test8');
之后的增量备份基于上一次的增量备份
innobackupex --user=backup --password=123456 --socket=/tmp/mysql_test.sock --defaults-file=/tmp/my.cnf
--incremental /data/backup/hotbackup/incremental_2 --incremental-basedir=/data/backup/hotbackup/incremental_1 --no-timestamp --parallel=2
4.4 增量备份恢复
恢复基础备份,加--redo-only选项
innobackupex --apply-log --redo-only --use-memory=20G /data/backup/hotbackup/full
--redo-only指只应用xtrabackup日志中已经提交的事务数据,不回滚还未提交的数据
将增量备份应用到基础备份,加--redo-only选项
innobackupex --apply-log --redo-only --use-memory=20G /data/backup/hotbackup/full --incremental-dir=/data/backup/hotbackup/incremental_1/
将最后一个增量备份应用到基础备份,不加--redo-only选项
innobackupex --apply-log --use-memory=20G /data/backup/hotbackup/full --incremental-dir=/data/backup/hotbackup/incremental_2/
将合并后的基础备份做一次apply操作,并回滚未提交的数据:
innobackupex --apply-log --use-memory=20G /data/backup/hotbackup/full
把恢复完成的备份复制到数据文件目录中,赋权并启动MySQL
mysqladmin -S /tmp/mysql_test.sock shut
mv /home/mysql_test/mysqlhome/data /home/mysql_test/mysqlhome/data_bak
mkdir /home/mysql_test/mysqlhome/data
innobackupex --defaults-file=/tmp/my.cnf --copy-back --rsync /data/backup/hotbackup/full/
chown -R mysql:test:mysql_test /home/mysql_test/mysqlhome/data
cd /home/mysql_test/mysqlhome
./bin/mysql_safe -user=mysql &
验证数据
mysql> select * from test;
4.5 不完全恢复
不完全恢复指基于位置或时间点分两次恢复,以跳过错误操作的位置或时间点。
查看备份文件
cd /data/backup/hotbackup/full/yyyymmdd
ls -l
从xtrabackup_binlog_info中查看备份结束时刻的binlog文件名和位置。
cat xtrabackup_binlog_info
查看当前数据库的binlog的文件名和位置。
mysql> show master logs;
从全备中恢复数据库,恢复全备;再从热备结束时刻binlog的位置开始,恢复到误操作时刻之前的binlog。
mysqlbinlog --start-position="热备结束时刻binlog的位置" --stop-datetime="误操作时刻" 所涉及的binlog文件名(多个文件用空格分隔) | mysql -uroot -p******
跳过故障点后,应用之后的所有binlog文件,完成恢复操作。
mysqlbinlog --start-datetime="误操作后的时刻" 所涉及的binlog文件名(多个文件用空格分隔) | mysql -uroot -p******
4.6 克隆slave
克隆应用于在线添加从库的业务场景。
--slave-info选项会将Master的binlog的文件名和偏移位置保存到xtrabackup_slave_info文件中。
--safe-slave-backup选项为了保证复制的一致性,会暂停Slave的SQL线程,直到没有打开的临时表的时候开始备份,待备份结束后再启动SQL线程。
在备机上进行备份:
innobackupex --user=backup --password=123456 --socket=/tmp/mysql_test.sock --defaults-file=/tmp/my.cnf
--slave-info --safe-slave-backup /data/backup/hotbackup/cloneslave --no-timestamp --parallel=2
查看生成的文件:
ls -lrt /data/backup/hotbackup/cloneslave
查看xtrabackup_slave_info文件内容,即新备机开启复制的change master语句:
cat /data/backup/hotbackup/cloneslave/xtrabackup_slave_info
在备机上进行还原:
innobackupex --apply-log --redo-only --use-memory=20G /data/backup/hotbackup/cloneslave
将还原后的文件复制到新备机
rsync -avprP -e ssh /data/backup/hotbackup/cloneslave newslave:/home/mysql_test/mysqlhome/data
在主库上创建对新备机的复制用户,并授权;
mysql> create user
mysql> grant
在新备机上拷贝备机的my.cnf文件,并修改server-id参数
scp slave:/etc/my.cnf /etc/my.cnf
vi /etc/my.cnf
skip-slave-start
server-id=3
log-slave-updates=1
在新备机上运行xtrabackup_slave_info文件中的change master语句:
mysql> change master to
启动新备机的MySQL,并检查复制线程是否正常(I/O,SQL):
mysql> start slave;
27.4 表的导入导出
27.4.1 导出
将表中数据导出为某些符号分隔的纯文本数据,而不是SQL语句。
纯文本数据优点:节省空间,加载速度快(是SQL的20倍),可用于execl显示。
1.select ... into outfile
语法:
SELECT * FROM tab_name INTO OUTFILE file_name [option];
option选项包括(char为单个字符,string可以是多个字符的组合):
fields terminated by 'string' --指定string为字段分隔符,默认为制表符'\t'
fields [optionally] enclosed by 'char' --字段引用符,如果加optionally选项则只用在char、varchar、text等字符类型上。默认不使用引用符。
fields escaped by 'char' --转义字符,默认'\',
lines starting by 'string' --指定string为每行开始符,默认''
lines terminated by 'string' --指定string为行结束符,默认'\n'
例子1:字段分隔符',' 字段引用符为'"' --结果是所有字段(包括数值类型的字段)的值都被双引号括起来。
mysql>select * from emp into outfile '/tmp/emp.txt' fields terminated by ',' enclosed by '"';
在mysql客户端执行操作系统命令的方法:system+操作系统命令
mysql>system cat /tmp/emp.txt
例子2:字段分隔符',' 字段引用符'"'只引用文本类型需要增加optionally子选项。
mysql>select * from emp into outfile '/tmp/emp.txt' fields terminated by ',' optionally enclosed by '"';
MySQL导出数据中转义字符本身、字段分隔符、记录分隔符将被转义:
当导出命令中包含字段引用符时,数据中含有的转义字符本身和字段引用符的字符会被自动转义;
当导出命令中不包含字段引用符时,数据中含有的转义字符本身和字段分隔符的字符会被自动转义。
注意:
select ... into outfile ...产生的输出文件不能重名,新文件不会覆盖原来文件,即不会生成新文件。
2.mysqldump
语法:
mysqldump -u 用户名 -T 目标文件 db_name tab_name [option]
option选项包括:
--fields-terminated-by=name --字段分隔符
--fields-enclosed-by=name --字段引用符
--fields-optionally-enclosed-by=name --文本类型的字段引用符
--fields-escaped-by=name --转义字符
--lines-terminated-by=name --记录结束符
例子:
# mysqldump -uroot -T /tmp test emp --fields-terminated-by ',' --fields-optionally-enclosed-by '"'
该命令生成了emp.txt(文本数据)和emp.sql(建表语句)
# more /tmp/emp.txt
# more /tmp/emp.sql
总结:mysqldump工具实际就是调用了select ... into outfile ...语句。
27.4.2 导入
将纯文本数据导入到数据库表中。
1.load data infile
语法:
mysql> load data [local] infile 'file_name' into table tab_name [option];
option选项包括(char为单个字符,string可以是多个字符的组合):
fields terminated by 'string' --指定string为字段分隔符,默认为制表符'\t'
fields [optionally] enclosed by 'char' --字段引用符,如果加optionally选项则只用在char、varchar、text等字符类型上。默认不使用引用符。
fields escaped by 'char' --转义字符,默认'\',
lines starting by 'string' --指定string为每行开始符,默认''
lines terminated by 'string' --指定string为行结束符,默认'\n'
ignore number lines --忽略文件的前number行数据
(col_name_or_user_var,...) --按照列出的字段顺序和字段数量加载数据
set col_name=expr,... --将列做一定的数值转换后再加载
例子1:
mysql> load data infile '/tmp/emp.txt' into table emp fields terminated by ',' enclosed by '"';
例子2:不加载前2行
mysql> load data infile '/tmp/emp.txt' into table emp fields terminated by ',' enclosed by '"' ignore 2 lines;
例子3:按指定列顺序加载
mysql> load data infile '/tmp/emp.txt' into table emp fields terminated by ',' enclosed by '"' ignore 2 lines (id,content,name);
例子4:只加载部分列
mysql> load data infile '/tmp/emp.txt' into table emp fields terminated by ',' enclosed by '"' ignore 2 lines (id);
例子5:加载时对列进行运算
mysql> load data infile '/tmp/emp.txt' into table emp fields terminated by ',' enclosed by '"' set id=id+10;
2.mysqlimport
语法:
# mysqlimport -uroot -p*** [local] db_name file_name [option]
option选项包括:
--fields-terminated-by=name --字段分隔符
--fields-enclosed-by=name --字段引用符
--fields-optionally-enclosed-by=name --文本类型的字段引用符
--fields-escaped-by=name --转义字符
--lines-terminated-by=name --记录结束符
--ignore-lines=number --忽略前number行
例子:
# mysqlimport -uroot -proot test /tmp/emp.txt --fields-terminated-by=',' --fields-enclosed-by='"'
注意:
不同操作系统平台行结尾符不同,Windows平台设置lines-terminated-by='\r\n',Linux平台设置lines-terminated-by='\n',IOS平台lines-terminated-by='\r'。
27.5 小结