it-swarm-eu.dev

Jak lze přesunout databázi z jednoho serveru na druhý?

Jak lze přesunout tabulky MySQL z jednoho fyzického serveru na druhý?

Například tento přesný scénář: Mám server MySQL, který používá tabulku innodb a má velikost asi 20 GB.

Chci jej přesunout na nový server, jaký je nejefektivnější způsob?

142
John

Můj oblíbený způsob je přenést příkaz sqldump k příkazu sql. Můžete provádět všechny databáze nebo konkrétní. Takže například

mysqldump -uuser -ppassword myDatabase | mysql -hremoteserver -uremoteuser -premoteserverpassword 

Můžete provádět všechny databáze pomocí

mysqldump --all-databases -uuser -ppassword | mysql -hremoteserver -uremoteuser -premoteserver 

Jediný problém je, když je databáze příliš velká a potrubí se zhroutí. V takovém případě můžete provést tabulku podle tabulky nebo některou z dalších metod uvedených níže.

84
David Hall

Nedávno jsem přesunul 30GB databázi s následující stragegy:

Starý server

  • Zastavte server mysql
  • Zkopírujte obsah datadir na jiné místo na disku (~/mysqldata/*)
  • Znovu spusťte server mysql (prostoje 10-15 minut)
  • komprimovat data (tar -czvf mysqldata.tar.gz ~/mysqldata)
  • zkopírujte komprimovaný soubor na nový server

Nový server

  • nainstalovat mysql (nespustit)
  • rozbalte komprimovaný soubor (tar -xzvf mysqldata.tar.gz)
  • přesunout obsah mysqldata do datadir
  • Ujistěte se, že vaše innodb_log_file_size je na novém serveru stejná, nebo pokud tomu tak není, nekopírujte staré soubory protokolu ( mysql tyto vygeneruje) )
  • Začněte mysql
67
Derek Downey

Podle MySQL 5.0 Guide Study Study Guide , Kapitola 32 Oddíl 32.3.4, Stránky 456,457 popisují Podmínky pro binární přenositelnost , které přinést následující:

Binární přenositelnost je důležitá, pokud chcete pořídit binární zálohu vytvořenou na jednom počítači a použít ji na jiném počítači, který má jinou architekturu. Například použití binární zálohy je jeden způsob, jak kopírovat databáze z jednoho serveru MySQL na druhý.

Pro MyISAM znamená binární přenositelnost, že můžete přímo kopírovat soubory pro tabulku MyISAM z jednoho serveru MySQL na jiný na jiném počítači a druhý server bude mít přístup k tabulce.

Pro InnoDB znamená binární přenositelnost, že můžete přímo kopírovat soubory tabulkového prostoru ze serveru MySQL na jednom počítači na jiný server na jiném počítači a druhý server bude mít přístup do tabulkového prostoru. Ve výchozím nastavení jsou všechny tabulky InnoDB spravované serverem uloženy společně v tabulkovém prostoru, takže přenositelnost tabulkového prostoru je funkcí toho, zda jsou všechny jednotlivé tabulky InnoDB přenosné. Pokud ani jedna tabulka není přenosná, není to ani tabulkový prostor.

Tabulky MyISAM a InnoDB jsou binární přenosné z jednoho hostitele na druhého, jsou-li splněny dvě podmínky:

  • Oba stroje musí používat celočíselnou aritmetiku dvou doplňkových doplňků
  • Oba počítače musí používat formát s plovoucí desetinnou čárkou IEEE, jinak tabulky nesmí obsahovat sloupce s plovoucí desetinnou čárkou (FLOAT nebo DOUBLE)

V praxi tyto dvě podmínky představují malé omezení. Standardem moderního hardwaru jsou dvě aritmetické celočíselné aritmetiky a formát IEEE s pohyblivou řádovou čárkou. Třetí podmínkou pro přenositelnost binárních dat InnoDB je to, že byste měli používat malá písmena pro tabulky a databáze. Důvodem je, že InnoDB tyto názvy ukládá interně (ve svém datovém slovníku) malými písmeny ve Windows. Použití malých písmen umožňuje binární přenositelnost mezi Windows a Unixem, pro vynucení použití malých písmen můžete do souboru voleb vložit následující řádky:

[mysqld]
lower_case_table_names=1

Pokud nakonfigurujete InnoDB tak, aby používal tabulkové prostory tabulky, podmínky pro binární přenositelnost se rozšíří tak, aby zahrnovaly také soubory .ibd pro tabulky InnoDB. (Podmínky pro sdílené tabulkové prostory stále platí, protože obsahují datový slovník, který ukládá informace o všech tabulkách InnoDB.)

Pokud nejsou podmínky pro přenositelnost binárních dat splněny, můžete zkopírovat tabulky MyISAM nebo InnoDB z jednoho serveru na druhý jejich uložením do nějakého textového formátu (například pomocí mysqldump) a opětovným načtením do cílového serveru.

Existují dva hlavní způsoby, jak na základě úložného stroje přesunout jednotlivé tabulky.

Pro daný příklad budeme předpokládat následující:

  1. datadir je/var/lib/mysql
  2. databáze s názvem mydb
  3. tabulka v mydb databázi s názvem mytable.

MyISAM tabulky

Pokud mydb.mytable používá paměťový modul MyISAM, tabulka se fyzicky projeví jako tři samostatné soubory

  1. /var/lib/mysql/mydb/mytable.frm (soubor .frm)
  2. /var/lib/mysql/mydb/mytable.MYD (.MYD soubor)
  3. /var/lib/mysql/mydb/mytable.MYI (.MYI soubor)

.Frm obsahuje strukturu tabulky
.MYD obsahuje data tabulky
.MYI obsahuje stránku indexu tabulky

Tyto soubory se používají vzájemně závisle k reprezentaci tabulky z logického hlediska v mysql. Protože k těmto souborům není připojeno žádné další logické přidružení, migruje tabulka z jednoho serveru DB na druhý. Můžete to dokonce udělat ze serveru Windows na Linux Server nebo MacOS. Samozřejmě můžete vypnout mysql a zkopírovat 3 soubory tabulky. Můžete spustit následující:

LOCK TABLES mydb.mytable READ;
SELECT SLEEP(86400);
UNLOCK TABLES;

v jedné ssh relaci držet stůl jako jen pro čtení a držet zámek po dobu 24 hodin. O sekundu později proveďte kopii v jiné ssh relaci. Poté zabijte relaci mysql pomocí zámku 24 hodin. Nemusíte čekat 24 hodin.

InnoDB tabulky

Na základě výše uvedeného citátu z Certifikační knihy existuje mnoho faktorů, které určují, jak zálohovat konkrétní tabulku InnoDB. Kvůli jednoduchosti, srozumitelnosti a stručnosti jednoduše provedete mysqldump požadované tabulky pomocí parametrů --single-transaction, abyste měli perfektní výpis tabulky v čase. Pokud chcete jen jednu tabulku, nemusíte se sémantikou InnoDB zabývat. Tuto skládku můžete znovu načíst na libovolný server MySQL podle svého výběru.

Protože zde byly sloučeny dvě otázky (jcolebrand): EDIT

Pokud jste více než ochotni žít s nějakým pomalým výkonem DB, můžete provést řadu rsyncs ze starého serveru (ServerA) na nový server (ServerB), i když mysql stále běží na ServerA.

Krok 01) nainstalujte stejnou verzi mysql na ServerB, jakou má ServerA

Krok 02) Na ServerA spusťte SET GLOBAL innodb_max_dirty_pages_pct = 0; od mysql a asi 10 minut (Toto vyčistí špinavé stránky z InnoDB Buffer Pool. Pomáhá také rychleji vypnout mysql) Pokud je vaše databáze MyISAM, můžete tento krok přeskočit.

Krok 03) rsync --archive --verbose --stats --partial --progress --human-readable ServerA:/var/lib/mysql ServerB:/var/lib/mysql

Krok 04) Opakujte krok 03, dokud rsync nezabere méně než 1 minutu

Krok 05) service mysql stop na ServerA

Krok 06) Proveďte ještě jednu rsync

Krok 07) scp ServerA:/etc/my.cnf ServerB:/etc/

Krok 08) service mysql start na ServerB

Krok 08) service mysql start na ServerA (volitelné)

Pokusit se !!!

CAVEAT

Takto můžete vytvořit replikačního otroka. Jen nezapomeňte mít server-id explicitně nastaven v master /etc/my.cnf a jiné číslo pro id-server v slave /etc/my.cnf

34
RolandoMySQLDBA

Myqldump ani nepotřebujete, pokud přesouváte celé schéma databáze a jste ochotni zastavit první databázi (takže je při přenosu konzistentní)

  1. Zastavte databázi (nebo ji zamkněte)
  2. Přejděte do adresáře, kde jsou datové soubory mysql.
  3. Přeneste složku a její obsah do adresáře dat mysql na novém serveru
  4. Spusťte zálohu databáze
  5. Na novém serveru zadejte příkaz 'create database'.
  6. Znovu vytvořte uživatele a udělte oprávnění.

Nemohu si vzpomenout, jestli mysqldump zpracovává uživatele a oprávnění nebo pouze data ... ale i když ano, je to cesta rychlejší než dělat výpis a provozovat ho. Použil bych to pouze, kdybych potřeboval vypsat databázi mysql a znovu ji vložit do jiného RDBMS, kdybych potřeboval změnit možnosti úložiště (innodb vs. myisam), nebo kdybych změnil hlavní verše mysql (ale Myslím, že jsem to udělal mezi 4 a 5, ačkoli)

29
Joe

Pokud chcete pouze přesunout konkrétní tabulku, zkuste:

mysqldump -u username -ppassword databasename tablename > databasename.tablename.sql

Stejným příkazem můžete zadat více názvů tabulek výše. Po dokončení příkazu přesuňte soubor databasename.tablename.sql na druhý server a poté jej obnovte pomocí:

mysql -u username -ppassword databasename < databasename.tablename.sql

Všimněte si, že zadní soubor .sql je vytvořen pomocí programu mysqldump a obnovení je provedeno přímo do mysql.

12
StanleyJohns
  1. Pokud máte ssh přístup, můžete použít mysqldump z příkazového řádku
  2. Pokud nemáte ssh přístup, ale máte phpMyAdmin přístup, můžete jej použít pro export/import
  3. Pokud nemáte přístup k phpMyAdminu, existují nějaké užitečné php skripty, které budou vypsány a importovány (nicméně když jsem mluvil z vlastní zkušenosti, nikdy jsem nenašel ten, který je stejně spolehlivý jako phpMyAdmin).

Tam by mohla být tato možnost, kde budete pohybovat skutečné databázové soubory (pro mou instalaci jsou umístěny na/var/lib/mysql), ale já nejsem opravdu shure, jak to bude fungovat/pracovat ven.

7
poelinca

Budete muset vzít prostoje. Bude to chvíli trvat v závislosti na rychlosti vaší sítě. Předpokládám, že provozujete MySQL v Linuxu/Unixu. Zde je postup, který používám:

  1. Zastavte démona mysql na zdrojovém hostiteli.
  2. Vytvořte složku TMP na cílovém hostiteli, abyste mohli přijímat soubory.
  3. Použijte screen k provedení Shell relace, která přežije, pokud bude váš ssh odpojen.
  4. K přenosu souborů mezi hostiteli použijte rsync. Něco jako: rsync -avhP source user @ targethost:/path/to/folder /
  5. Spusťte testovací případy, abyste se ujistili, že jste při přenosu nic neztratili.

Poté pokračujte jako obvykle s nastavením místní MySQL.

* Poznámka: Můžete také použít parametr -c s rsync k přidání kontrolního součtu k přenosu, bude to však záviset na rychlosti procesoru.

5
randomx

Myslím, že všechny dřívější odpovědi pravděpodobně fungují dobře, ale neřeší problém nastavení názvu databáze během přenosu.

Takto jsem to udělal s bash:

Možná bude lepší použít rsync než scp, a nekomprimovat soubor, pokud to děláte často.

Na mém zdrojovém serveru:

[email protected]:~$ d=members
[email protected]:~$ mysqldump $d | gzip > $d.sql.gz
[email protected]:~$ scp -i .ssh/yourkeynamehere $d.sql.gz $sbox:$d.sql.gz

Na mém cílovém serveru:

[email protected]:~$ d1=members
[email protected]:~$ d2=members_sb
[email protected]:~$ mysqladmin create $d2
[email protected]:~$ cat $d1.sql.gz | gunzip |  mysql $d2

Na obou počítačích můžete vidět pokrok:

[email protected]:~$ ls *.gz 
[email protected]:~$ cat $d.sql.gz | gunzip |  less

To vše předpokládá, že máte soubor konfigurace MySQL ve svém domovském adresáři na obou počítačích a nastavujete oprávnění:

$ echo "
[client]
user=drupal6
password=metoknow
Host=ord-mysql-001-sn.bananas.com
[mysql]
database=nz_drupal" > .my.cnf
$ chmod 0600 ~/.my.cnf
4
ErichBSchulz

Mohu potvrdit, že metoda DTest funguje také pro kopírování mezi ubuntu a osx.

Chcete-li zkopírovat všechny databáze, aniž byste museli provádět jakýkoli dumping nebo podobné:

Ujistěte se, že máte čistý mysql z mysql (nainstalován dmg stažený z mysql http://cdn.mysql.com/Downloads/MySQL-5.1/mysql-5.1.63-osx10.6-x86_64.dmg ), které (VELMI DŮLEŽITÉ) nebylo nikdy spuštěno.

Zkopírujte obsah složky/var/lib/mysql/složky z počítače Ubuntu na/usr/local/mysql/data/obsah na počítači Mac. Pro získání přístupu k získání složky na počítači Ubuntu jsem musel použít Sudo, tj .:

Sudo cp /var/lib/mysql /home/foouser/mysql_data_folder
Sudo chown -R foouser /home/foouser/mysql_data_folder

Zkopíroval jsem složku pomocí scp.

Než začnete kopírovat složku mysql v počítači Mac, ujistěte se, že nic nepokazíte.

Po zkopírování složky proveďte na počítači Mac následující postup:

Sudo chown -R _mysql /usr/local/mysql/data/
Sudo chgrp -R wheel /usr/local/mysql/data/
Sudo chmod -R g+rx /usr/local/mysql/data/

Spusťte server mysql poprvé (z podokna předvoleb v části Systémové předvolby-> mysql). Všichni uživatelé a databáze by nyní měli být nastaveni správně.

Toto fungovalo s mysql 5.1.61 na 64bitovém 11.10 bitu Ubuntu a 5.163 s mysql na lvi osx (macbook pro).

4
paalvibe

přesouváte se na jiný server mysql db? pokud ano, proveďte export

# mysqldump -u username -ppassword database_name > FILE.sql
3
seyz4all

Obecná linuxová metoda:

/etc/init.d/mysqld stop
rsync -avz source_files destination
vi /etc/my.cnf

upravte datadir (a soket) pro mysqld a mysqld_safe (je-li použit), aby ukazovaly na nové umístění, pak

/etc/init.d/mysql start

Zaslal jsem to, protože se zdálo, že nikdo jednoduše neuvedl nejmenší počet kroků k tomu a cítím, že je to nejjednodušší způsob, jak osobně.

3
seeafish

Navrhl bych dva jednoduché kroky pro přenos celé databáze z jednoho serveru na druhý.

Krok 1: Proveďte úplnou zálohu databází ve zdrojovém serveru pomocí mysqldump.

Krok 2: Pomocí příkazu rsync můžete přenést celé databáze na cílový server.

2
Rudra

Možná je to lepší způsob, jak toho dosáhnout:

Verze 1: kopie datových souborů (pouze MYISAM)

ssh server1
service mysql stop
cd $mysql-data-dir
rsync -avz dirs-or-files server2:$mysql-data-dir
service mysql start

ssh server2 restart služby mysql

  • Pokud jsou soubory databáze pouze ke čtení, můžete přeskočit zastavení serveru.

Verze 2: mysqldump

Nainstalujte pigz - na moderní procesory Xeon nebo Opteron, zejména pokud máte 2 nebo více procesorů, je MUCH rychlejší než gzip.

ssh server1 
mysqldump ... | pigz > backup-YYMDD.sql.gz
rsync backup-YYMDD.sql.gz server:location

ssh server2
pigz -dc location/backup-YYMDD.sql.gz | mysql ..

Verze: master/slave + mysqldump/file-copy

In HA environment you should use the following trick:
setup slave server & do all backups from it
before backups - do "slave stop"; 
then do version 1 or version 2

skript:

touch full.start
mysqladmin -h slave-db stop-slave
echo "show slave status \G" | mysql -h slave-db > FULL/comfi-$NOW.master-position
/usr/bin/mysqldump -h slave-db --default-character-set=utf8 -A --opt --skip-lock-tables | pigz > "FULL/XXXX-$NOW.sql.gz"
mysqladmin -h slave-db start-slave
touch full.end

ln -fs "FULL/XXXX-$NOW.sql.gz" FULL.sql.gz

PS:

pro kopírování malých tabulek použijte:

ssh server1 tabulka schématu mysqldump | schéma ssh serveru2 mysql

2
parf