Нужен экспортный запрос, а не создание файла для mysqldump без триггеров - PullRequest
0 голосов
/ 05 мая 2010

У меня есть код как

$db_name = "db";
$outputfile = "/somewhere";
$new_db_name = 'newdb';

$cmd = 'mysqldump --skip-triggers %s > %s  2>&1';
$cmd = sprintf($cmd, escapeshellarg($db_name), escapeshellcmd($output_file));
exec($cmd, $output, $ret); 
if ($ret !=0 ) {
    //log error message in $output
}

Затем импортировать:

$cmd = 'mysql --database=%s < %s 2>&1';
$cmd = sprintf($cmd, escapeshellarg($new_db_name), escapeshellcmd($output_file));
exec($cmd, $output, $ret); 
//etc.

unlink($outputfile);

Но что мне делать, чтобы получить запрос на экспорт, а не создавать файл каждый раз?

РЕДАКТИРОВАНИЕ:

ОТВЕТ НА ОТВЕТ МАТА

  • Я использую Windows. Будет ли работать код, который вы дали, поскольку я не уверен, что код, который у меня уже есть, будет работать в Windows, как кажется, команды linux?
  • Мне нужно написать скрипт на PHP, это процесс, который будет запущен при установке компонента в joomla
  • Что такое PIPE в PHP?

1 Ответ

1 голос
/ 05 мая 2010

Вы должны сделать это на PHP? Вы можете легко сделать это в терминале с некоторыми базовыми функциями (не нужно создавать какие-либо файлы).

Две команды, и все готово:

echo 'create database foo2' | mysql -uroot
mysqldump --skip-triggers -uroot foo | mysql -uroot foo2

Копирует foo в новую базу данных foo2

Обратите внимание, что возможно pipe в php .. но .. на самом деле, вы должны просто сделать это в shell (IMO).

Edit:

Упс, почему-то я думал, что вы хотели триггеры. Отредактировано выше, чтобы включить --skip-triggers

Редактировать 2:

«Трубопровод» относится к трассе stdout и stdin.

Windows поддерживает каналы. Вышеуказанные команды работают для меня в Windows.

Однако я не могу заставить работать трубопровод через PHP с Windows (по крайней мере, для mysql). Это как потоки из proc_open игнорируют мой ввод.

Таким образом, альтернативой было бы взять команды, которые я предоставил выше, поместить их в файл .bat и посмотреть, можно ли вызвать этот скрипт с помощью system()

Окончательное редактирование :

Вам нужно будет провести некоторое исследование, поскольку я не могу объяснить каждую мелочь. Вы ссылались на документацию system(), на которую я указывал? Позволяет вызывать системные команды ..

Мое предложение состоит в том, чтобы вы сделали основной скрипт, назовите его bla.bat:

@echo off
echo create database foo2 | mysql -uroot
mysqldump --skip-triggers -uroot foo | mysql -uroot foo2

Если он находится в той же папке, что и ваш скрипт, то ваш скрипт может сделать это:

<?php
system('cmd.exe /C ' . dirname(__FILE__).'\\bla.bat');

Виола. БД скопирована.

...