LW IT Solutions
« Blog Overview /IT & Networks / Ekstrakcja konkretnych fragmentów z ogromnych zrzutów SQL...
This post in other languages:

Ekstrakcja konkretnych fragmentów z ogromnych zrzutów SQL przy użyciu PHP

Ekstrakcja konkretnych fragmentów z ogromnych zrzutów SQL przy użyciu PHP

Czasami trzeba przywrócić tylko jedną bazę danych lub określoną tabelę z wielogigabajtowego (np. 5 GB) zrzutu MySQL. Otwarcie tak dużego pliku w standardowych edytorach tekstu, takich jak VS Code czy Notepad++, zazwyczaj kończy się drastycznym spadkiem wydajności lub całkowitym zawieszeniem programu.

Zamiast męczyć się z oprogramowaniem desktopowym lub skomplikowanymi narzędziami wiersza poleceń (jak awk czy sed), możemy użyć prostego, wydajnego pod względem pamięci skryptu PHP, aby wyciągnąć dokładnie to, czego potrzebujemy.

Rozwiązanie: Przetwarzanie strumieniowe

Sztuczka polega na tym, aby nie ładować całego pliku do pamięci naraz (co robią funkcje takie jak file_get_contents()). Używając funkcji fgets() w PHP, możemy przetwarzać ogromny plik strumieniowo, linia po linii.

Poniższy skrypt szuka standardowych komentarzy mysqldump, które wskazują początek docelowej bazy danych lub tabeli (np. -- Current Database: db„). Gdy znajdzie nasz cel, przełącza flagę, aby rozpocząć zapisywanie tych linii do nowego pliku. Gdy tylko natrafi na początek innej bazy danych lub tabeli, wyłącza zapis.

Oto kompletny skrypt:

<?php
ini_set('memory_limit', '2G');

$inputFile = 'dump_5GB.sql';
$outputFile = 'db_fragment.sql';
$targetName = 'db';

$in = fopen($inputFile, 'r');
$out = fopen($outputFile, 'w');

$isExtracting = false;

while (($line = fgets($in)) !== false) {
    if (strpos($line, '-- Current Database: `' . $targetName . '`') === 0 || 
        strpos($line, 'USE `' . $targetName . '`;') === 0) {
        $isExtracting = true;
    } elseif (strpos($line, '-- Current Database: `') === 0 || 
              strpos($line, 'USE `') === 0) {
        $isExtracting = false;
    }

    if (!$isExtracting) {
        if (strpos($line, '-- Table structure for table `' . $targetName . '`') === 0 ||
            strpos($line, '-- Table structure for table `' . $targetName . '_') === 0) {
            $isExtracting = true;
        } elseif (strpos($line, '-- Table structure for table `') === 0) {
            $isExtracting = false;
        }
    }

    if ($isExtracting) {
        fwrite($out, $line);
    }
}

fclose($in);
fclose($out);

Ta metoda utrzymuje zużycie pamięci na ułamkowym poziomie – nie przekraczając kilku megabajtów – i w ciągu kilku sekund przetwarza gigabajty danych SQL.

Lukas Wojcik

Lukas Wojcik

Systems architect and technology enthusiast specializing in scalable tracking solutions, GMP Stack (GA4 & GTM), and robust backend architectures. Advocate for clean code and privacy-first design.

Get in Touch

Briefly describe your project or inquiry for a tailored response. This site is protected by reCAPTCHA.

Napisanie komentarza

Adres e-mail nie jest publikowany. Pola obowiązkowe oznaczono gwiazdką.

ALL ARTICLES & CATEGORIES

CCTV

Śledź tę kategorię przez RSS

Cloud & AI

Śledź tę kategorię przez RSS

Data Privacy

Wszystkie artykuły w tej kategorii (11) Śledź tę kategorię przez RSS

Digital Analytics

Wszystkie artykuły w tej kategorii (40) Śledź tę kategorię przez RSS

Digital Marketing

Wszystkie artykuły w tej kategorii (23) Śledź tę kategorię przez RSS

IT & Networks

Wszystkie artykuły w tej kategorii (13) Śledź tę kategorię przez RSS

Raspberry Pi

Śledź tę kategorię przez RSS

Smart Home

Śledź tę kategorię przez RSS

Tworzenie stron internetowych

Śledź tę kategorię przez RSS

Wtyczki i triki WordPress

Śledź tę kategorię przez RSS