數據導出與導入


快速導出和導入

一 介紹

​ 在公司中,如果運營或者產品手里有幾千萬甚至幾億條數據,要求你將其導入數據中,請問如何做?

​ 如果你依據運營或產品交給你的數據文件直接使用insert語句,一行一行地批量插入,那至少需要1-2天時間才能插入完畢,此時我們可以用LOAD DATA INFILE語句。

LOAD DATA INFILE語句可以從一個文本文件中,將數據以很高的速度讀入一個表中。MySQL官方文檔也說明了,該方法比一次性插入一條數據性能快20倍。

​ 此外,mysql也支持快速導出語句SELECT INTO OUTFILE

使用MySQL的SELECT INTO OUTFILE 、LOAD DATA INFILE快速導出導入數據,12G的數據導出用時3分鍾左右,導入用時4分鍾左右(執行時間根據機器的配置會有所不同,不具有參考價值)

二 快速導出

表的快速導出

語法:
SELECT... INTO OUTFILE 導出文本文件

要想導出成功,需要設置安全目錄才行
vim /etc/my.cnf
[mysqld]
secure-file-priv=/tmp

示例:
SELECT * FROM db1.t1
    INTO OUTFILE '/tmp/db1_t1.txt'
    FIELDS TERMINATED BY ','      -- 定義字段分隔符
    OPTIONALLY ENCLOSED BY '"'    -- 定義字符串使用什么符號括起來
    LINES TERMINATED BY '\n';     -- 定義換行符

快速導入

語法
LOAD DATA INFILE 導入的文本文件路徑

示例
mysql> DELETE FROM student1;
mysql> create table new_t1(表結構與文件中數據保持一致);
mysql> LOAD DATA INFILE '/tmp/db1_t1.txt'
			INTO TABLE new_db.new_t1
			FIELDS TERMINATED BY ','
			OPTIONALLY ENCLOSED BY '"'
			LINES TERMINATED BY '\n';

其他導出

mysql 命令導出文本文件
示例:
# mysql -u root -pEgon123 -e 'select * from db1.t1' > /tmp/db1_t1.txt
# mysql -u root -pEgon123 --xml -e 'select * from db1.t1' > /tmp/db1_t1.xml
# mysql -u root -pEgon123 --html -e 'select * from db1.t1' > /tmp/db1_t1.html

三 示例

1、准備測試數據

create database jason_test;
use jason_test;
create table employee(
id int not null unique auto_increment,
name varchar(20) not null,
sex enum('male','female') not null default 'male', 
age int(3) unsigned not null default 28,
hire_date date not null,
post varchar(50),
post_comment varchar(100),
salary double(15,2),
office int, 
depart_id int
);

#插入記錄
#三個部門:教學,銷售,運營
insert into employee(name,sex,age,hire_date,post,salary,office,depart_id) values
('jason','male',18,'20170301','God',7300.33,401,1),
('alex','male',78,'20150302','teacher',1000000.31,401,1),
('wupeiqi','male',81,'20130305','teacher',8300,401,1),
('yuanhao','male',73,'20140701','teacher',3500,401,1),
('liwenzhou','male',28,'20121101','teacher',2100,401,1),
('jingliyang','female',18,'20110211','teacher',9000,401,1),
('jinxin','male',18,'19000301','teacher',30000,401,1);

設置安全目錄為/tmp,並重啟

vim /etc/my.cnf
[mysqld]
secure-file-priv=/tmp

快速導出

SELECT * FROM jason_test.employee
    INTO OUTFILE '/tmp/test.txt'
    FIELDS TERMINATED BY ','      -- 定義字段分隔符
    OPTIONALLY ENCLOSED BY '"'    -- 定義字符串使用什么符號括起來
    LINES TERMINATED BY '\n';     -- 定義換行符

導入

# 創建表,表結構與數據保持一致
create database if not exists test;
use test;
create table t1(
    id int not null unique auto_increment,
    name varchar(20) not null,
    sex enum('male','female') not null default 'male', 
    age int(3) unsigned not null default 28,
    hire_date date not null,
    post varchar(50),
    post_comment varchar(100),
    salary double(15,2),
    office int, 
    depart_id int
);

# 快速導入
LOAD DATA INFILE '/tmp/test.txt'
    INTO TABLE test.t1
    FIELDS TERMINATED BY ','
    OPTIONALLY ENCLOSED BY '"'
    LINES TERMINATED BY '\n';

四 數據庫遷移

4.1 為何要遷移數據庫

數據庫遷移是我們經常可遇到的問題,對於少量的數據,遷移基本上不會有什么問題。生產環境中,有以下情況需要做遷移工作:

  • 1、磁盤空間不夠

    比如一些老項目,選用的機型並不一定適用於數據庫。隨着時間的推移,硬盤很有可能出現短缺;

  • 2、業務出現瓶頸

    比如項目中采用單機承擔所有的讀寫業務,業務壓力增大,不堪重負。

    如果 IO 壓力在可接受的范圍,會采用讀寫分離方案;

  • 3、機器出現瓶頸

    機器出現瓶頸主要在磁盤 IO 能力、內存、CPU,此時除了針對瓶頸做一些優化以外,選擇遷移是不錯的方案;

  • 4、項目改造

    某些項目的數據庫存在跨機房的情況,可能會在不同機房中增加節點,或者把機器從一個機房遷移到另一個機房。再比如,不同業務共用同一台服務器,為了緩解服務器壓力以及方便維護,也會做遷移。

4.2 MySQL遷移數據庫的方案

通常有三種方案

  • 1、數據庫直接導出,拷貝文件到新服務器,在新服務器上導入。
    [rml_read_more]:

    #例如
    (1)基於mysqldump
    在源主機執行下述命令,需要目標主機開啟遠程賬號權限
    mysqldump -h 遷移源IP -uroot -p123 --databases bbs | mysql -h 目標IP -uroot -p456 
    (2)基於LOAD DATA INFILE
    
    #優點:
    會重建數據文件,減少數據文件的占用空間(釋放undo段),兼容性最好,導出導入很少發生問題,需求靈活
    
    #缺點:
    導入導出都需要很長的時間,並且導出后的文件還要經過網絡傳輸,也要占用一定的時間。
    
  • 2、使用第三方遷移工具。

    #例如
    使用【MySQL GUI Tools】中的 MySQLMigrationTool。
    
    #優點:
    設置完成后傳輸無人值守,自動完成
    
    #缺點:
    1、不夠靈活,設置繁瑣
    2、傳輸時間長,
    3、傳輸中網絡出現異常,不能及時的被發現,並且會一直停留在數據傳輸的狀態不能被停止,如不仔細觀察不會被發現異常。
    4、異常后很難從異常的位置繼續傳輸。
    
  • 3、數據文件和庫表結構文件直接拷貝到新服務器,掛載到同樣配置的MySQL服務下。

    優點:
    時間占用最短,文件可斷點傳輸,操作步驟少。
    
    缺點:
    新舊服務器中MySQL版本及配置必須相同,可能引起未知問題。
    

假如數據庫遷移是因為業務瓶頸或項目改造等需要變動數據表結構的(比如分區分表),我們便只能使用第一種方法了。

下面介紹一下第三種方案的遷移步驟:

1、保證Mysql版本一致,安裝配置基本一致(注意:這里的數據文件和庫表結構文件都指定在同一目錄data下)
2、停止兩邊的Mysql服務(A服務器--遷移-->B服務器)
3、刪除B服務器Mysql的data目錄下所有文件
4、拷貝A服務器Mysql的data目錄下除了ib_logfile和.err之外的文件到B服務器data下
5、啟動B服務器的Mysql服務,檢測是否發生異常


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM