18

複数のデータベースの mysqldump ファイルがあります (5)。データベースの 1 つはロードに非常に長い時間がかかります。mysqldump ファイルをデータベースごとに分割する方法、または mysql に指定されたデータベースの 1 つだけをロードするように指示する方法はありますか?

マニッシュ

4

7 に答える 7

27

この Perl スクリプトでうまくいくはずです。

#!/usr/bin/perl -w
#
# splitmysqldump - split mysqldump file into per-database dump files.

use strict;
use warnings;

my $dbfile;
my $dbname = q{};
my $header = q{};

while (<>) {

    # Beginning of a new database section:
    # close currently open file and start a new one
    if (m/-- Current Database\: \`([-\w]+)\`/) {
    if (defined $dbfile && tell $dbfile != -1) {
        close $dbfile or die "Could not close file!"
    } 
    $dbname = $1;
    open $dbfile, ">>", "$1_dump.sql" or die "Could not create file!";
    print $dbfile $header;
    print "Writing file $1_dump.sql ...\n";
    }

    if (defined $dbfile && tell $dbfile != -1) {
    print $dbfile $_;
    }

    # Catch dump file header in the beginning
    # to be printed to each separate dump file.  
    if (! $dbname) { $header .= $_; }
}
close $dbfile or die "Could not close file!"

すべてのデータベースを含むダンプ ファイルに対してこれを実行します。

./splitmysqldump < all_databases.sql
于 2010-12-03T16:24:35.650 に答える
13

または、すべてのデータベースを個別のファイルに直接保存することもできます...

#!/bin/bash
dblist=`mysql -u root -e "show databases" | sed -n '2,$ p'`
for db in $dblist; do
    mysqldump -u root $db | gzip --best > $db.sql.gz
done
于 2012-08-03T11:46:21.563 に答える
1

これは、私がこの種のことをmysqldump.

http://gtowey.blogspot.com/2009/11/restore-single-table-from-mysqldump.html

個々のデータベースを抽出するように簡単に拡張できます。

于 2010-12-03T17:34:16.603 に答える
1

私は、1 つの大きなダンプ ファイルをデータベースごとに 1 つの小さなファイルに分割する python スクリプトに取り組んできました。その名前はdumpsplitで、ここにスクラッチがあります:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import re
import os

HEADER_END_MARK = '-- CHANGE MASTER TO MASTER_LOG_FILE'
FOOTER_BEGIN_MARK = '\/\*\!40103 SET TIME_ZONE=@OLD_TIME_ZONE \*\/;'
DB_BEGIN_MARK = '-- Current Database:'

class Main():
    """Whole program as a class"""

    def __init__(self,file,output_path):
        """Tries to open mysql dump file to call processment method"""
        self.output_path = output_path
        try:
            self.file_rsrc = open(file,'r')
        except IOError:
            sys.stderr.write('Can\'t open %s '+file)
        else:
            self.__extract_footer()
            self.__extract_header()
            self.__process()

    def __extract_footer(self):
        matched = False
        self.footer = ''
        self.file_rsrc.seek(0)
        line = self.file_rsrc.next()
        try:
            while line:
                if not matched:
                    if re.match(FOOTER_BEGIN_MARK,line):
                        matched = True
                        self.footer = self.footer + line
                else:
                    self.footer = self.footer + line
                line = self.file_rsrc.next()
        except StopIteration:
            pass
        self.file_rsrc.seek(0)

    def __extract_header(self):
        matched = False
        self.header = ''
        self.file_rsrc.seek(0)
        line = self.file_rsrc.next()
        try:
            while not matched:
                self.header = self.header + line
                if re.match(HEADER_END_MARK,line):
                    matched = True
                else:
                    line = self.file_rsrc.next()
        except StopIteration:
            pass
        self.header_end_pos = self.file_rsrc.tell()
        self.file_rsrc.seek(0)

    def __process(self):
        first = False
        self.file_rsrc.seek(self.header_end_pos)
        prev_line = '--\n'
        line = self.file_rsrc.next()
        end = False
        try:
            while line and not end:
                    if re.match(DB_BEGIN_MARK,line) or re.match(FOOTER_BEGIN_MARK,line):
                    if not first:
                        first = True
                    else:
                        out_file.writelines(self.footer)
                        out_file.close()
                    if not re.match(FOOTER_BEGIN_MARK,line):
                        name = line.replace('`','').split()[-1]+'.sql'
                        print name
                        out_file = open(os.path.join(self.output_path,name),'w')
                        out_file.writelines(self.header + prev_line + line)
                        prev_line = line
                        line = self.file_rsrc.next()
                    else:
                        end = True
                else:
                    if first:
                        out_file.write(line)
                    prev_line = line
                    line = self.file_rsrc.next()
        except StopIteration:
            pass

if __name__ == '__main__':
    Main(sys.argv[1],sys.argv[2])
于 2010-12-28T12:46:15.190 に答える
0

スタノが提案したように、ダンプ時に次のようなものを使用するのが最善の方法です...

mysql -Ne "show databases" | grep -v schema | while read db; do mysqldump $db | gzip > $db.sql.gz; done

もちろん、これは ~/.my.cnf ファイルの存在に依存しています

[client]
user=root
password=rootpass

それ以外の場合は、mysql および mysqldump 呼び出しに -u および -p パラメーターを使用して定義するだけです。

mysql -u root -prootpass -Ne "show databases" | grep -v schema | while read db; do mysqldump -u root -prootpass $db | gzip > $db.sql.gz; done

お役に立てれば

于 2013-01-17T13:37:00.547 に答える
-1

ダンプとリロードを段階的に行う場合があります。

  1. データベースごとのダンプで --no-data を使用してテーブル構造のダンプを取得します。
  2. 新しいサーバーで構造を作成する
  3. データベース レベルごとに --no-create-info を使用してテーブルのデータ ダンプを取得します
  4. 現在、データベースごとにダンプがあるため、特定のファイルが大きい場合は、カット ファイルでもファイルを分割できます。

注: MyISAM テーブルを使用している場合は、ステップ 4 でインデックス評価を無効にし、後で再度有効にして挿入を高速化できます。

于 2015-06-22T20:00:26.260 に答える
-1

「mysqldump ファイル」は、SQL ステートメントでいっぱいの単なるテキスト ファイルです。そのため、さまざまなテキスト エディターを使用して、適切と思われる方法で切り刻むことができます。

最初に、より選択的なダンプを行うことで、より良いサービスが提供される場合があります (ファイルごとに 1 つのデータベースのみなど)。元のデータベースにアクセスできない場合は、完全な復元を行ってから、mysqldump を再度使用して個々のデータベースのダンプを作成することもできます。

簡単で汚い解決策が必要な場合は、簡単なグーグル検索で、役立つ可能性のあるいくつかの ツールへの参照が得られます.

于 2009-12-09T21:08:51.087 に答える