1. Dump structure of the big database.
2. Open the sql file and cut the constraints.
3. Import the structure to another database.
4. Run this code:
/** * Sync from live database */ ini_set('memory_limit','512M'); $limit = 100000; $time = time(); $sleep = 1; $sleepEvery = 60; $link = new mysqli( "__HOST__", "__USER__", "__PASSWORD__", "__DATABASE__" ); $link->set_charset("utf8"); $importLink = new mysqli( "__HOST__", "__USER__", "__PASSWORD__", "__DATABASE__" ); $importLink->set_charset("utf8"); $result = $link->query('SHOW TABLES'); $tables = []; while($row = mysqli_fetch_assoc($result)) { /** * Filter the tables if you want */ $table = $row[key($row)]; $tables[] = $table; } foreach ($tables as $table) { $offset = 0; $hasRows = true; while ($hasRows) { echo "Excecuting SELECT * FROM `$table` LIMIT $limit OFFSET $offset" . PHP_EOL; flush(); $result = $link->query("SELECT * FROM `$table` LIMIT $limit OFFSET $offset"); if (!$result) { $hasRows = false; break; } $rows = []; while($row = mysqli_fetch_assoc($result)) { $rows[] = $row; } if (!empty($rows)) { dumpToDatabase($table, $rows); } $offset += $limit; takeANap(); if (count($rows) < $limit) { $hasRows = false; break; } } } function takeANap() { global $time, $sleep, $sleepEvery; if ($time + $sleepEvery <= time()) { $time = time(); echo 'Sleep for ' . $sleep . PHP_EOL; flush(); sleep($sleep); } } function dumpToDatabase($table, $rows) { global $importLink; echo 'begin_transaction' . PHP_EOL; $importLink->begin_transaction(); $inserts = []; foreach ($rows as $row) { $values = []; foreach ($row as $id => $value) { $values[] = "'".mysqli_real_escape_string($importLink, $value)."'"; } $inserts[] = sprintf( '(%s)', implode(',', $values) ); if (count($inserts) >= 1000) { $str = sprintf( 'INSERT INTO `%s` (%s) VALUES %s;', $table, implode(',', array_keys($row)), implode(',', $inserts) ); $importLink->query($str); echo mysqli_error($importLink) . PHP_EOL; $inserts = []; } } if (!empty($inserts)) { $str = sprintf( 'INSERT INTO `%s` (%s) VALUES %s;', $table, implode(',', array_keys($row)), implode(',', $inserts) ); $importLink->query($str); } echo 'commit' . PHP_EOL; $importLink->commit(); } die('END');
5. Add the constrains from step 2.
Easy as that.