Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Перенести таблицу на другой сервер
 
 автор: Osipov   (25.05.2007 в 09:39)   письмо автору
 
 

У меня есть большая база данных (>100Мб) на локальном компьютере, а мне нужно перенести её на хостинг. Можно было бы сделать LOAD DATA INFILE, но хостинг не поддреживает хранение на диске файлов больше двух мегабайт. Как быть?

И ещё. Там доступ к базе только с localhost'а. (PHP есть и там и у меня)

   
 
 автор: Osipov   (25.05.2007 в 16:36)   письмо автору
 
   для: 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=&in;
  }
  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-запросу.

   
 
 автор: Temnovit   (25.05.2007 в 16:51)   письмо автору
 
   для: Osipov   (25.05.2007 в 09:39)
 

в PHPMyAdmin есть кнопочка "Экспорт". Сам пользовался - остался доволен :)

   
 
 автор: Osipov   (26.05.2007 в 20:31)   письмо автору
 
   для: Temnovit   (25.05.2007 в 16:51)
 

Кнопочка "Экспорт" ничуть не лучьше программы mysqldump, которая постовляется вместе с mysql 4.1 (который у меня стоит). А проблема в том, что генерируемый такими способами файл занимает >100МБ и не может быть с одной стороны отослан на посто на тот сервер (стоит лимит для размеров файлов), а с другой --- импортирован с помощью PHPMyAdmin (т. к. UPPLOAD_MAX_FILESIZE=2MB).

   
 
 автор: Trianon   (26.05.2007 в 22:28)   письмо автору
 
   для: Osipov   (26.05.2007 в 20:31)
 

Насколько я помню, в свежих версиях PMA есть способы сжатия дампа, и способы вытаскивания дампа по частям. Конечно, если у Вас есть доступ к консоли - всё куда проще.

   
 
 автор: Osipov   (27.05.2007 в 00:01)   письмо автору
 
   для: Trianon   (26.05.2007 в 22:28)
 

К сожалению, ssh у меня туда нету, да и это, я думаю, не спасло бы --- MySQL сервер поддерживает только локальные соединения.

Кроме того, как я написал уже, проблема решена и базу я уже перенёс (благо, я уже имел написанный мною же модуль на С++ для сетевых соединений, о котором идёт речь выше, без которого, думаю, мне пришлось бы куда сложнее).

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования