|
|
|
| У меня есть большая база данных (>100Мб) на локальном компьютере, а мне нужно перенести её на хостинг. Можно было бы сделать LOAD DATA INFILE, но хостинг не поддреживает хранение на диске файлов больше двух мегабайт. Как быть?
И ещё. Там доступ к базе только с localhost'а. (PHP есть и там и у меня) | |
|
|
|
|
|
|
|
для: Osipov
(25.05.2007 в 09:39)
| | Я нашёл выход. Правда непростой.
На сервер загружается PHP файл
<?php
include "sql.php";
foreach($_REQUEST["str"] as $v)
{ mysql_query($v=stripslashes($v));
if(mysql_error()!="")
print "<b>$v</b>: ".mysql_error()."<br>";
}
?>
|
где файл "sql.php" содержит код для подключения к базе данных.
Дальше пишется программа на C++, которая вызывает этот скрыпт дл каждой записи.
Может, быть кому-нибудь пригодиться. Вот пограмма (Win32) http://poetry.mooo.com/sqlsender.exe
Которая в качестве первого параметра принимает имя файла дампа (как генерирует PHPMyAdmin и mysqldump), а в качестве второго --- url скрипта (c http:// ). Программа выводит только "|" после обработки сотни запросов, "+" после тысячи и "*" после десяти тысячь. Больше никакой информации. Если коме наду, могу дать исходники (она привязаны к Win32).
Вот исходник, собственно программы
////////sqlsender.h
#include <iostream>
#include <fstream>
#include <string>
#include <queue>
using namespace std;
class parser
{ istream* i;
public:
parser(istream&in)
{ i=∈
}
string getrequest()
{ queue<char> curstr;
int state=0;
int scoblev=0;
char c;
while(state!=-1&&i->get(c))
{ curstr.push(c);
//cout<<"(("<<state<<c<<":"<<scoblev<<"))";
switch(state)
{ case 0:
if(c=='"')
state=1;
else if(c=='\'')
state=3;
else if(c==';'&&scoblev==0)
state=-1;
else if(c=='(')
scoblev++;
else if(c==')')
scoblev--;
break;
case 1:
if(c=='\\')
state=2;
else if(c=='"')
state=0;
break;
case 2:
state=1;
break;
case 3:
if(c=='\\')
state=4;
else if(c=='\'')
state=0;
break;
case 4:
state=3;
break;
}
}
string res;
res.resize(curstr.size(),0);
size_t i;
for(i=0;!curstr.empty();i++)
{ res[i]=curstr.front();
curstr.pop();
}
res[i]=0;
return res;
}
};
|
// sqlsender.cpp : Defines the entry point for the console application.
//
#include "..\otveter\requester.h"
#include "stdafx.h"
#include "sqlsender.h"
int main(int argc, char** argv)
{ if(argc<3)
{ return -1;
}
requester resp;
ifstream ifs(argv[1]);
parser p(ifs);
string st;
string request;
request.reserve(10000);
int i=0;
char ii='0';
size_t count=0;
while((st=p.getrequest()).size()!=0)
{ request+="str[]="+resp.goodstring(st)+"&";
i++;
ii++;
if(i==50)
{ i=0;
ii='0';
resp.post(argv[2],request);
request="";
}
count++;
if(count%10000==0)
{ cout<<"*";
}
else if(count%1000==0)
{ cout<<"+";
}
else if(count%100==0)
{ cout<<"|";
}
}
resp.post(argv[2],request);
return 0;
}
|
Это системно-независимая часть программы, использующая класс requester (исходники которого я могу дать), а вернее методы post этого класса (который отправляет данные на сервер методом post) и goodstring (который аналогичен PHP функции urlencode).
Класс parser предназнацен для чтения из файла по одному sql-запросу. | |
|
|
|
|
|
|
|
для: Osipov
(25.05.2007 в 09:39)
| | в PHPMyAdmin есть кнопочка "Экспорт". Сам пользовался - остался доволен :) | |
|
|
|
|
|
|
|
для: Temnovit
(25.05.2007 в 16:51)
| | Кнопочка "Экспорт" ничуть не лучьше программы mysqldump, которая постовляется вместе с mysql 4.1 (который у меня стоит). А проблема в том, что генерируемый такими способами файл занимает >100МБ и не может быть с одной стороны отослан на посто на тот сервер (стоит лимит для размеров файлов), а с другой --- импортирован с помощью PHPMyAdmin (т. к. UPPLOAD_MAX_FILESIZE=2MB). | |
|
|
|
|
|
|
|
для: Osipov
(26.05.2007 в 20:31)
| | Насколько я помню, в свежих версиях PMA есть способы сжатия дампа, и способы вытаскивания дампа по частям. Конечно, если у Вас есть доступ к консоли - всё куда проще. | |
|
|
|
|
|
|
|
для: Trianon
(26.05.2007 в 22:28)
| | К сожалению, ssh у меня туда нету, да и это, я думаю, не спасло бы --- MySQL сервер поддерживает только локальные соединения.
Кроме того, как я написал уже, проблема решена и базу я уже перенёс (благо, я уже имел написанный мною же модуль на С++ для сетевых соединений, о котором идёт речь выше, без которого, думаю, мне пришлось бы куда сложнее). | |
|
|
|