2010-10-22 13 views
5

Próbuję użyć PHP i MySQL's Utwórz tabelę Wybierz między dwoma różnymi serwerami MySQL. Nie jestem pewien, czy można to zrobić za pomocą SQL. Otrzymuję żadnych błędów, ale nic nie mogę zrobić albo:Czy mogę używać MySql Create Select na dwóch różnych serwerach z PHP?

<?php 
$dbname = 'cms'; 
$dbmaster = 'cmsms'; 

$db1 = mysql_connect('localhost', 'root', 'secret'); 
if (!$db1) { 
    echo 'Could not connect to mysql'; 
    exit; 
} 

$db2 = mysql_connect('server2', 'root', 'secret'); 
if (!$db2) { 
    echo 'Could not connect to mysql'; 
    exit; 
} 

mysql_select_db("$dbname", $db1) or die ("Unable to select database"); 
mysql_select_db("$dbmaster", $db2) or die ("Unable to select database"); 

$sql = "SHOW TABLES FROM $dbname"; 
$result = mysql_query($sql, $db1); 

if (!$result) { 
    echo "DB Error, could not list tables\n"; 
    echo 'MySQL Error: ' . mysql_error(); 
    exit; 
} 

while ($row = mysql_fetch_row($result)) { 
    $sql = "DROP TABLE `$row[0]`"; 
    mysql_query($sql, $db1); 
    echo "Table rows: {$row[0]} Deleted <br/>"; 
    $sql = "CREATE TABLE $row[0] SELECT * FROM $db2.$dbmaster.$row[0] "; 
    mysql_query($sql, $db1); 
    echo "Table: {$row[0]} created <br/>"; 

} 
echo "<br/>done..."; 

mysql_free_result($result); 
?> 

To linia:

$sql = "CREATE TABLE $row[0] SELECT * FROM $db2.$dbmaster.$row[0] "; 

po prostu nie działa. $ db2 nie powoduje przejścia do innego serwera i wybrania.

Od przeczytania tekstu na stronie Znalazłem kogoś podobnego i ktoś powiedział, że nie da się tego zrobić i spojrzeć na tabele federacyjne, które nie będą działać dla mnie.

Jeśli nie można tego zrobić powyżej, czy ktoś wie, jak zrobić to, co robię? Usuwam tabele z kopii i ponownie je tworzę na podstawie tabeli w master. Następnie wybieram dane w urządzeniu master, aby wstawić ponownie utworzone tabele. Dziękujemy

Aktualizacja: Po prostu mogę być jasne. Kod działa, jeśli wszystko było na tym samym serwerze i miałem tylko jedno połączenie z bazą danych. To z powodu utworzyć tabelę wybierz, że mam problemy, Wierzę,. Ten SQL musi używać dwóch serwerów w tym samym czasie. Stworzona tabela jest dla jednej bazy danych, która po prostu upuściła tabele, ale wybór wybiera z bazy danych drugiego połączenia - dwa połączenia w tej samej instrukcji SQL.

+0

@phill Chciałbym, gdybym otrzymał odpowiedzi, które byłyby właściwe. Próbuję wrócić i przejrzeć je, ale wiele razy są po prostu złe lub nie testowałem ich. – johnny

+0

Wystarczy rzucić okiem na niektóre ze starszych pytań, na które, jak sądzę, odpowiedziano, z wieloma rozwiązaniami. Zauważ, że patrzyłem tylko na pytania PHP, ale jest więcej niż jedna odpowiedź na większość twoich pytań z akceptowalnymi rozwiązaniami. –

+0

@phill to nie jest moje doświadczenie, ale jestem szczęśliwy, aby je sprawdzić, jeśli dają właściwą odpowiedź. Nie mam zamiaru nikogo trzymać i docenić wszystkie odpowiedzi. – johnny

Odpowiedz

7

Tak, na swoim skrypcie PHP możesz wykonywać wszystkie zapytania, które chcesz, na wszystkich różnych serwerach, do których masz dostęp i uprawnienia.

Nie określasz jednak swojej bazy danych na $sql. Określasz go po uruchomieniu funkcji mysql_query.

Więc kod:

$sql = "SHOW TABLES FROM $dbname"; 
$result = mysql_query($sql, $db1); 

jest źle. Powinno być tylko:

$sql = "SHOW TABLES"; 
$result = mysql_query($sql, $db1); 

Korzystając $db1 na drugim parametrem mysql_query jesteś już określającej, że chcesz pokazać tylko tabele z tej bazy danych.

Podążając za tym samym rozumowaniem w innych zdaniach, powinieneś być w stanie uzyskać pożądane rezultaty.

Nie będzie w stanie to zrobić:

$sql = "CREATE TABLE $row[0] SELECT * FROM $db2.$dbmaster.$row[0] "; 

Jeśli chcesz wstawić wiersze z $db2 do nowo utworzonych tabel na $db1, trzeba:

  1. uruchomić kwerendę na $db2, aby uzyskać wyniki
  2. Utwórz tabelę na $db1
  3. Powtórz $db2 Wyniki
  4. Rekordy Wstaw na nowym stole na $db1

Nie ma magia sposób to zrobić tylko w jednym zdaniu.

+0

Problem dotyczy opcji Utwórz Wybierz wstawkę. To oświadczenie obejmuje dwa serwery. Najpierw tworzy nową tabelę na serwerze jeden, ale wybór pochodzi z serwera drugiego. Więc nie jestem pewien, jak to mi pomoże. Mam nadzieję, że po prostu nie rozumiem czegoś łatwego. Dzięki. – johnny

+0

Nie. Nie będziesz w stanie WPROWADZAĆ BEZPOŚREDNIO jednym zdaniem z jednego serwera do drugiego. Musisz: uruchomić kwerendę na serwerze SERVER1, utworzyć tabelę na serwerze SERVER2, zapełnić nową tabelę wynikami z kwerendy uruchomionej na serwerze SERVER1. Nie ma prostego sposobu robienia tego, będziesz musiał wykonać wstawki w osobnych zdaniach. –

+0

@ pablo nie będzie oznaczało wypisywania wszystkich kolumn, takich jak: wstawić do wartości tbl1 (a, b, c, ...) (a, b, c, ...) dla każdej tabeli? – johnny

0

usunąć połączenie z bazą danych $ DB2 z zapytaniem

Jeśli chcesz uruchomić SQL na użyciu $ baza1 to

mysql_query($sql, $db1); 

Jeśli chcesz uruchomić SQL w użytku $ DB2 Ta

mysql_query($sql, $db2); 
+0

Problem polega na tym, że opcja create select używa dwóch serwerów. – johnny

0

Nie sądzę, że jest to najlepszy projekt bazy danych, Johnny, zależy oczywiście od tego, co próbujesz osiągnąć. Jeśli chcesz po prostu przechowywać dane na obu serwerach dla nadmiarowości, powinieneś skorzystać z replikacji MySQL. Jeśli oddzielasz dane w celu uzyskania wysokiej dostępności, rozważ fragmentowanie danych, partycjonowanie i spójrz na serwer proxy MySQL.

Pozwoli to na wykonanie wszystkich czynności poza aplikacją, więc nie trzeba będzie zmieniać aplikacji w przypadku zmiany schematu shardingu/tworzenia partycji/tworzenia kopii zapasowych/nadmiarowości. Takie narzędzia sprawiają, że jest to całkowicie niewidoczne dla twojej aplikacji.

Przepraszam, jeśli nie jest to temat.

3

Jesteś na dobrej drodze, ale brakuje ważnego punktu. Twój kod PHP otworzył połączenie z db1 i db2, ale to nie znaczy, że serwer db1 wie o serwerze db2. Dlatego nie można przekazać do zapytania db1 kwerendy z db2 i oczekiwać, że otrzyma z niego wiersze. Twój skrypt PHP musi działać jako pośrednik.

Musisz wydać polecenie select, aby wybrać wiersze z tabeli db1, a następnie przeprowadź pętlę nad instrukcjami wstawiania wyników dla db2. Oczywiście robisz to po wydaniu polecenia create table, aby utworzyć pustą tabelę. Zakładam również, że próbujesz użyć sztuczki "stwórz tabelę do wyboru", ponieważ nie wiesz, jak wydać tabelę tworzenia, aby skopiować układ tabeli w db1. Widziałeś to?

http://dev.mysql.com/doc/refman/5.0/en/show-create-table.html

+0

Robię tworzenie tabeli wybierz z tego powodu, ale nie wiem inny sposób to zrobić. Nie wiem, co mi powiedziałeś w linku, który podałeś. Po prostu pokazał mi instrukcję tworzenia tabeli. dziękuję za zrozumienie mojego kodu. – johnny

+0

Przepraszamy. Mówię tylko, że jeśli chcesz odtworzyć tabelę w db2 dokładnie tak, jak jest w db1, możesz wydać to polecenie na db1, a następnie wykonaj instrukcję create, którą ci podała i wydaj polecenie na db2, aby uzyskać dokładną kopię tabeli definicja. Po utworzeniu tabeli możesz wypełnić ją danymi, jak sugerowałem powyżej. – bot403

0

Istnieje kilka możliwości wyboru masz w odniesieniu do ustalania tego.

1) Wykonaj replikację asynchroniczną mysql. Robiłoby to to samo, co próbujesz zrobić w PHP, ale byłoby znacznie wydajniejsze. Mysql Documentation: Replication

2) Napraw swój skrypt, aby przesyłać strumieniowo dane z serwera głównego do serwera kopii zapasowych. Można to zrobić, tworząc tabelę, a następnie ładując wiersz wyników według wierszy do tabeli serwera kopii zapasowych.

Powiązane problemy