Я пытаюсь написать программу PHP для автоматического создания резервных копий таблиц MySQL в виде файлов sql на сервере:
$backup = "$path/$tablename.sql"; $table = "mydbname.mytablename"; exec( sprintf( '/usr/bin/mysqldump --host=%s --user=%s --password=%s %s --quick --lock-tables --add-drop-table > %s', $host, $user, $password, $table, $backup ) );
Все, что я получаю в результирующем файле .sql, это:
-- MySQL dump 10.10 -- -- Host: localhost Database: mydbname.mytablename -- ------------------------------------------------------ -- Server version 5.0.27 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
Кажется подозрительным, что список результатов Database: mydbname.mytablename.
Я не знаю, с чего начать искать. Мой хост, помогая мне настроить программу изначально, сказал, что мне нужно деактивировать safe_mode (уже было сделано) и предоставить доступ к двоичному файлу (я не знаю, что это значит).
Поскольку хозяин принимает два дня, чтобы отвечать каждый раз, когда я задаю вопрос, я хотел бы решить это сам, если это возможно.
Команда mysqldump выглядит так:
/usr/bin/mysqldump --host=HOST --user=USER --password=PASSWORD TABLE --quick --lock-tables --add-drop-table
Посмотрев руководство по mysqldump, я бы сказал, что он будет думать, что TABLE на самом деле является именем вашей базы данных (цитирование):
Существует три общих способа вызова туздЫшпр:
shell> mysqldump [options] db_name [tables]
shell> mysqldump [options] --databases db_name1 [db_name2 db_name3...]
shell> mysqldump [options] --all-databases
По-видимому, вы должны поместить имя базы данных перед именем таблицы, которую хотите сбросить.
Итак, например, что-то вроде этого может сделать трюк:
/usr/bin/mysqldump --host=HOST --user=USER --password=PASSWORD DBNAME TABLE --quick --lock-tables --add-drop-table
Надеюсь, это поможет!
EDIT: Я действительно сделал быстрый тест, используя "databasename.tablename", как и вы:
mysqldump --user=USER --password=PASSWORD --no-data DBNAME.TABLENAME
Я получаю тот же вывод, который у вас есть... Но у меня также есть ошибка:
mysqldump: Got error: 1102: Incorrect database name 'DBNAME.TABLENAME' when selecting the database
Который, я предполагаю, подходит к выходу ошибки, а не к стандартным выводам (вы только перенаправляете этот второй файл в свой файл)
Если я использую:
mysqldump --user=USER --password=PASSWORD --no-data DBNAME TABLENAME
Все работает нормально: нет ошибки, и у меня есть дамп.