2011-06-06 33 views
4

我有一個大的數據庫,我正在複製到從屬服務器。試圖通過一個普通的mysqldump導入它(大約15GB)需要2天,並且失敗了。所以我正在嘗試mysqldump --tab技巧。myslqimport - 使用線程

我也想使用--use-threads導入 - 但它似乎沒有一次做多個表。有什麼辦法可以判斷它是否在工作?

mysqldump --single-transaction --quick --hex-blob --master-data=1 --tab=/tmp/backup/ apm 

奴隸:

cat *.sql | mysql apm 
mysqlimport --lock-tables --use-threads=4 apm /tmp/backup/*.txt 

另外:不知道如何禁用二進制日誌不編輯conf文件並重新啓動服務器?似乎有點笨&慢,MySQL的所有數據再次複製到二進制日誌了。

回答

2

您使用的是MySQL 5.1.7 or later嗎?

如果您想測試事情是否真的如預期的那樣進行,爲什麼不使用測試模式並且只使用sample of data以便運行速度更快?

更新 關於--use-threads是否正常工作,我不確定一種方法來確定檢查。不過,我看不出在一些測試中,我只是〜130M數據跑出任何真正的差別:

mysqlimport --lock-tables --debug-info --use-threads=2 test /tmp/test/*.txt 
Records: 2076063 Deleted: 0 Skipped: 0 Warnings: 0 

User time 0.02, System time 0.08 
Maximum resident set size 3884, Integral resident set size 0 
Non-physical pagefaults 737, Physical pagefaults 0, Swaps 0 
Blocks in 0 out 0, Messages in 0 out 0, Signals 0 
Voluntary context switches 1340, Involuntary context switches 17 

---- 

mysqlimport --lock-tables --debug-info --use-threads=4 test /tmp/test/*.txt 
Records: 2076063 Deleted: 0 Skipped: 0 Warnings: 0 

User time 0.03, System time 0.09 
Maximum resident set size 3884, Integral resident set size 0 
Non-physical pagefaults 738, Physical pagefaults 0, Swaps 0 
Blocks in 0 out 0, Messages in 0 out 0, Signals 0 
Voluntary context switches 1343, Involuntary context switches 41 

---- 

mysqlimport --lock-tables --debug-info --use-threads=8 test /tmp/test/*.txt 
Records: 2076063 Deleted: 0 Skipped: 0 Warnings: 0 

User time 0.02, System time 0.09 
Maximum resident set size 3884, Integral resident set size 0 
Non-physical pagefaults 738, Physical pagefaults 0, Swaps 0 
Blocks in 0 out 0, Messages in 0 out 0, Signals 0 
Voluntary context switches 1341, Involuntary context switches 30 
+0

我完整列表。但是,我怎麼會告訴一個小樣本,它是在平行進行呢? – Kevin 2011-06-07 01:00:32

+0

是的,我在5.5.8。令人驚訝的是,在線用戶線程很少提及,大數據庫的備份/恢復沒有1!好像任何超過幾個演出需要幾天innodb。 Percona有一個數據複製工具,但它複製了所有的數據庫,並且需要更多的設置。 – Kevin 2011-06-07 01:07:00

+0

對不起,我讀了「有什麼方法可以判斷它是否在工作?」作爲整個問題的一部分,不僅僅是爲了使用線程。示例建議是爲了快速檢查您的流程是否正常工作,因爲您沒有表明它是已知的工作。 – Cez 2011-06-07 08:43:34

0

通過略讀的源代碼,我想你應該禁用選項--lock-tables,見下圖:

#ifdef HAVE_LIBPTHREAD 
    if (opt_use_threads && !lock_tables) 
    { 
    pthread_t mainthread;   /* Thread descriptor */ 
    pthread_attr_t attr;   /* Thread attributes */ 
    pthread_attr_init(&attr); 
    pthread_attr_setdetachstate(&attr, 
           PTHREAD_CREATE_DETACHED); 

    VOID(pthread_mutex_init(&counter_mutex, NULL)); 
    VOID(pthread_cond_init(&count_threshhold, NULL)); 

    for (counter= 0; *argv != NULL; argv++) /* Loop through tables */ 
    { 
     pthread_mutex_lock(&counter_mutex); 
     while (counter == opt_use_threads) 
     { 
     struct timespec abstime; 

     set_timespec(abstime, 3); 
     pthread_cond_timedwait(&count_threshhold, &counter_mutex, &abstime); 
     } 
     /* Before exiting the lock we set ourselves up for the next thread */ 
     counter++; 
     pthread_mutex_unlock(&counter_mutex); 
     /* now create the thread */ 
     if (pthread_create(&mainthread, &attr, worker_thread, 
         (void *)*argv) != 0) 
     { 
     pthread_mutex_lock(&counter_mutex); 
     counter--; 
     pthread_mutex_unlock(&counter_mutex); 
     fprintf(stderr,"%s: Could not create thread\n", 
       my_progname); 
     } 
    } 

    /* 
     We loop until we know that all children have cleaned up. 
    */ 
    pthread_mutex_lock(&counter_mutex); 
    while (counter) 
    { 
     struct timespec abstime; 

     set_timespec(abstime, 3); 
     pthread_cond_timedwait(&count_threshhold, &counter_mutex, &abstime); 
    } 
    pthread_mutex_unlock(&counter_mutex); 
    VOID(pthread_mutex_destroy(&counter_mutex)); 
    VOID(pthread_cond_destroy(&count_threshhold)); 
    pthread_attr_destroy(&attr); 
    } 
+1

有趣,謝謝:)我實際上在過去的一年中一直在使用percona mysql的熱備份腳本。他們創建了一個完整的「可引導」mysql數據目錄,因此沒有任何要導入的東西。 – Kevin 2013-07-18 15:03:13

1

事實上,當您指定要導入的多個文件時(多個表格中),線程纔會啓動 - 它無助於單個大文件。

判斷它是否實際線程化的方法是查看SHOW PROCESSLIST輸出。在這裏你可以看到它實際上工作,雖然如上所述,在不同的表格上。

mysql> show processlist; 
+-------+--------+------------------+------+---------+------+-----------+------------------------------------------------------------------------------------------------------+ 
| Id | User | Host    | db | Command | Time | State  | Info                         | 
+-------+--------+------------------+------+---------+------+-----------+------------------------------------------------------------------------------------------------------+ 
| 4097 | root | 127.0.0.1:33372 | test | Query | 0 | executing | show processlist                      | 
| 6145 | root | 10.2.13.44:44182 | test | Query | 3 | executing | LOAD DATA INFILE 'qpcrecpls2.tsv' INTO TABLE `qpcrecpls2` IGNORE 0 LINES       | 
| 7169 | root | 10.2.13.44:44186 | test | Query | 3 | executing | LOAD DATA INFILE 'qpcrecpls1.tsv' INTO TABLE `qpcrecpls1` IGNORE 0 LINES       | 
| 8193 | root | 10.2.13.44:44184 | test | Query | 3 | executing | LOAD DATA INFILE 'qpcrecpls3.tsv' INTO TABLE `qpcrecpls3` IGNORE 0 LINES       | 
| 9217 | root | 10.2.13.44:44188 | test | Query | 3 | executing | LOAD DATA INFILE 'qpcrecpls4.tsv' INTO TABLE `qpcrecpls4` IGNORE 0 LINES       | 
| 10241 | root | 10.2.13.44:44183 | test | Query | 3 | executing | LOAD DATA INFILE 'qpcrecpls5.tsv' INTO TABLE `qpcrecpls5` IGNORE 0 LINES       | 
| 11265 | root | 10.2.13.44:44185 | test | Query | 3 | executing | LOAD DATA INFILE 'qpcrecpls.tsv' INTO TABLE `qpcrecpls` IGNORE 0 LINES        | 
| 12289 | root | 10.2.13.44:44189 | test | Query | 3 | executing | LOAD DATA INFILE 'qpcrecpls6.tsv' INTO TABLE `qpcrecpls6` IGNORE 0 LINES       | 
| 13313 | root | 10.2.13.44:44190 | test | Query | 3 | executing | LOAD DATA INFILE 'qpcrecpls7.tsv' INTO TABLE `qpcrecpls7` IGNORE 0 LINES       | 
+-------+--------+------------------+------+---------+------+-----------+------------------------------------------------------------------------------------------------------+ 

- 右側輸出也亮起。

0

我用mydumper替代了mysqldump/mysqlimport。

Mydumper使用多線程以.sql格式創建邏輯備份,myloader可以使用多個線程導入它們。

唯一的缺點是您必須自己從源代碼構建它,因爲似乎沒有可用的二進制包。儘管如此,我發現在CentOS上構建起來非常簡單。

https://launchpad.net/mydumper

2

像@賬單karwin,我也用mydumper/myloader

在Ubuntu:

sudo apt-get install mydumper 

在別的什麼,請按照以下說明: http://centminmod.com/mydumper.html

然後,備份:

mydumper -h [host] -u [user] -p [pass] -P [port] -B [database] -c -C --regex '^(?!excluded_table_1|excluded_table_2)' -v 3 

然後,恢復:

myloader -d [dir_created_by_mydumper] -h [host] -u [user] -p [pass] -P [port] -o -C -v 3 

注:

  • -C標誌壓縮MySQL協議,只能使用在外部託管的數據塊
  • -c使用gzip壓縮,好主意,離開所有的時間
  • -v 3給出詳細輸出(所以你可以看到發生了什麼),腳本如果你離開它,它會跑得更快。
  • --regex可以是任何有效的正則表達式。
  • 創建一個~/.my.cnf文件,你不需要主機,用戶,通過,端口了。
  • mydumper --helpmyloader --hel則p給你的選項