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?
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.
Nedávno jsem přesunul 30GB databázi s následující stragegy:
~/mysqldata/*
)tar -czvf mysqldata.tar.gz ~/mysqldata
)tar -xzvf mysqldata.tar.gz
)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í:
MyISAM tabulky
Pokud mydb.mytable používá paměťový modul MyISAM, tabulka se fyzicky projeví jako tři samostatné soubory
.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
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í)
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)
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.
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.
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:
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.
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
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).
přesouváte se na jiný server mysql db? pokud ano, proveďte export
# mysqldump -u username -ppassword database_name > FILE.sql
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ě.
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.
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