Mysqldump и NULL

Ньюанс создания дампа

Всем привет! Сегодня очередная интересная история. Некоторе время назад, потребовалось автоматизировать создание дампов баз данных. Сайтов много, времени мало, а решение нужно универсальное. Полазив по интернету и пообщавшись с духами в онлайне решил, что для решения этой задачи вполне подойдет утилита mysqldump. Я написал небольшой скрипт, примером которого там же и вооружился. 

        $dbName = config::database('name');
        $dbHost = config::database('host');
        $dbPass = config::database('pass');
        $dbUser = config::database('user');
        $dumpPath = ROOT . '/app/cache/dump';
        $dumpSql = $dumpPath . '/' . date('Y-m-d', time());
        $fileName = date('Y-m-d__U', time());
        createDir($dumpSql);
        $fileSql = $dumpSql . '/' . $fileName . '.sql';
        exec('mysqldump --user=' . $dbUser . ' --password=' . $dbPass . ' --host=' . $dbHost . ' ' . $dbName . ' --set-charset=utf8mb4 > ' . $fileSql, $output, $status);

Скрипт отработал, дамп создался и я на некоторое время об этой проблеме забыл. Однако сегодня, совершенно неожиданно, пришлось к ней вернуться. Развернув проект на локальной машине, я решил использовать такой дамп для базы. Однако обнаружил, что некоторые функции стали работать не правильно. Поиски меня привели к базе данных, а точнее к таблице где были записанны идентификаторы другой таблицы, в некоторых полях id был неопределён и должен стоять NULL, однако там, по чему-то, красовался ноль, индексы также отсутствовали. Пум-пум-пум, непорядок однако. Предчувствуя неладное, я полез в дамп. В INSERT в полях, где должен был быть NULL записана пустая строка. Приехали.

Не буду описывать процесс поиска решения, однако замечу, что примеров применения mysqldump аналогичных приведеного выше, в сети довольно много. Не стоит делать вывод в файл таким образом. Правильнее использовать специально созданный для этого параметр --result-file:

exec('mysqldump --user=' . $dbUser . ' --password=' . $dbPass . ' --host=' . $dbHost . ' ' . $dbName . '  --result-file=' . $fileSql, $output, $status);

Будте внимательнее, читайте документацию и пусть ваши скрипты работаю без ошибок!

Grewi 2024