Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]Baza zablokowana
Forum PHP.pl > Forum > Bazy danych > MySQL
majestiq
Mam dziwny problem.
Używam 2 baz danych gdyż, z powodu dużego obciążenia często dosteje 'kare' 10 minutowej blokady.
W takim wypadku przełączam się na 2 baze.

Realizuje to takim sktyptem (uproszczone):

  1. <?php
  2. error_reporting(E_ALL ^ E_WARNING ^ E_NOTICE );
  3.  
  4. $connection = mysql_connect($db_danee['hostname'], $db_danee['user'], $db_danee['password']);
  5. @mysql_select_db($db_danee['db']);
  6. $sqltest="SELECT * FROM `mp3` LIMIT 1"; 
  7. $res = mysql_query ($sqltest); 
  8. $res = mysql_fetch_array ($res);
  9. var_dump($res);
  10. //exit;
  11.  
  12. if (!is_null($res)) { echo 'baza 1'; }
  13. else { echo 'baza 2'; }
  14.  
  15. ?>


No i jeśli select zwróci wynik to łącze się z 1 bazą, jeśli wynik jest pusty łącze się z bazą zapasową.

No i ogólnie to nawet działa, ale za którymś przełączeniem (może już za 2-3) dzieje się bardzo dziwna sytuacja, bo pomimo, że baza jest zablokowana i nie działa, to ten select zwraca mi wynik
tak jakby baza najzwyczajniej działała i nie jest realizowane przełączenie na tymczasową!

Tak jakby wszystkie dane z bazy były już w jakimś cachu i mimo blokady bazy są pobierane.

Jest to dla mnie duży problem bo dużą część czasu mój serwis nie działa z powodu błędnego sprawdzenia czy dana baza działa.
Spotkał się ktoś z podobną sytuacją questionmark.gif

Pzdr
-szawel-
co ci nigdy nie zwroci pustego wyniku zawsze kostaniesz komunikt o
bledzie
majestiq
Nie zrozumieliśmy się.

Baza nie działa (jest połączenie, ale jest zablokowana) a jednak SELECT działa i zwraca (nie puste) wyniki
tak jakby dane z bazy były zapisane w jakimś cachu.

POMOCY!!!
sniezny_wilk
Cytat(majestiq @ 9.06.2008, 09:27:20 ) *
Nie zrozumieliśmy się.

Baza nie działa (jest połączenie, ale jest zablokowana) a jednak SELECT działa i zwraca (nie puste) wyniki
tak jakby dane z bazy były zapisane w jakimś cachu.

POMOCY!!!


Skąd wiesz, że jest zablokowana ? Wykonaj sobie inne zapytanie, a się przekonasz.
majestiq
Bo jak włączam Phpmyadmina to widzę wyraźnie brak tabel i info na czerwono ze przekroczyłem limit czasu zapytań na godzine.
sniezny_wilk
Cytat(majestiq @ 9.06.2008, 09:35:56 ) *
Bo jak włączam Phpmyadmina to widzę wyraźnie brak tabel i info na czerwono ze przekroczyłem limit czasu zapytań na godzine.


To wykonaj inne zapytanie i sprawdź co Tobie zwróci. Patrzyłeś co zwraca var_dump ?
nospor
  1. <?php
  2. $res = mysql_fetch_array ($res);
  3.  
  4. if (!is_null($res)) { echo 'baza 1'; }
  5. ?>

Jak dla mnie to jest bez sensu. Proponuje zajrzec do manuala i sprawdzic co zwraca mysql_fetch_array() a nastepnie sprawdzic co robi is_null()....
majestiq
Var_dump zwraca: NULL baza 2, bo w tej chwili 1 jest zablokowana no i spoko, ale przy następnym sprawdzeniu, gdy baza 1 się odblokuje a potem znowu zostanie zablokowana, to var_dump zwraca konkretny wiersz z tabeli a przecież baza jest nieaktywna.

Inaczej - jest coś takiego jak cache bazy (gdzieś są zapamiętane wyniki poprzedniego zapytania) i przy następnym przejściu nawet mimo, że baza jest zablokowana skrypt pobiera dane questionmark.gifquestionmark.gif
Może jest inny sposób na sprawdzenie czy baza działa (bez selecta) ?

Zauważyłem kolejną dziwną prawidłowość.

Zapytanie, którym pobieram dane z bazy i sprawdzam czy baza funkcjonuje poprawnie (poprzez zwrócenie niezerowego wyniku) wygląda tak jak napisałem wyżej czyli:
$sqltest="SELECT * FROM `mp3` LIMIT 1";

No i kiedy następuje sytuacja, że baza nie działa select ten zwraca pusty wynik i jest realizowane przełączenie na zapasówkę. Wygląda na to, że właśnie w tym momencie zaczyna się
coś dziwnego dziać bo już przy następnym sprawdzeniu (w trakcie korzystania z bazy zapasowej) to zapytanie jakby wariuje i już nie zwraca poprawnego wyniku (pojawia się błąd zapytania select)
, ale najśmieszniejsze jest to, że wystarczy zmienić cokolwiek w tym zapytaniu czyli ustawić np inny limit:

$sqltest="SELECT * FROM `mp3` LIMIT 2"; i wszystko wraca do normy, tak jakby zapytanie które raz było wykorzystane jest już spalone i nie działa poprawnie.

Bardzo dziwna sprawa, ale nie wierzę, że nie ma na to logicznego wytłumaczenia.
Może jak realizuje połączenie z baza zapasową, a potem chcę znowu sprawdzić czy 1 baza działa (wiadomo inny dostęp) to wtedy 'coś' nie chce mnie poprawnie połączyć ponownie z 1 baza i jezt ZONK questionmark.gif
cojack
A nie lepiej to zrobić na sposób wytłumiania błędów przy połączeniu z bazą?
majestiq
Możesz podać jakieś szczegóły questionmark.gif
(połączenie z bazą jest jako takie lecz jest ona 'wewnętrznie' zablokowana)
cojack
no zwykłe tłumienie błędów:

  1. <?php
  2. @$db = new mysqli ('host', 'login', 'haslo', 'baza_danych');
  3. if (mysqli_connect_error())
  4. {
  5. @$dbc = new mysqli ('host', 'login', 'haslo', 'baza_danych');
  6. //reszta
  7. }
  8. ?>


o to Ci chodziło? Może ja Ciebie źle zrozumiałem...

@EDIT

ewentualnie druga propozycja:
  1. <?php
  2. @$db = new mysqli ('host', 'login', 'haslo', 'baza_danych');
  3. if (mysqli_connect_error())
  4. {
  5. @$dbc = new mysqli ('host', 'login', 'haslo', 'baza_danych');
  6. //reszta
  7. exit; //zapomniałem tutaj dodać exit, jezeli by go tutaj nie było, reszta kodu po ifie została by wykonana a nie o to tutaj nam chodziło
  8. }
  9.  
  10. $zapytanie = "SELECT * FROM nazwa_tabeli";
  11. $wynik = $db->query($zapytanie);
  12.  
  13. $ile_znalezionych = $wynik -> num_rows;
  14.  
  15. if (!$ile_znalezionych)
  16. {
  17. @$dbc = new mysqli ('host', 'login', 'haslo', 'baza_danych');
  18.  //reszta
  19. }
  20. ?>
majestiq
Mysqli działa mi tylko pod PHP5.


  1. <?php
  2. @$db = new mysqli ('host', 'login', 'haslo', 'baza_danych');
  3. if (mysqli_connect_error())
  4. {
  5. @$dbc = new mysqli ('host2', 'login2', 'haslo2', 'baza_danych2');
  6. echo 'baza 1';
  7. }
  8.  echo 'baza 2';
  9. ?>



Za każdym razem, niezależnie od tego czy jest połączenie z bazą pojawia się napis:

baza 1 baza 2

Czyli coś to nie działa za bardzo ...

Kto mi wytłumaczy w końcu jakim cudem ten kod:

  1. <?php
  2. error_reporting(E_ALL ^ E_WARNING ^ E_NOTICE );
  3.  
  4.  
  5. $db_danee["hostname"] = "sql.test.nazwa.pl"; 
  6. $db_danee["user"] = 
  7. $db_danee["password"] = 
  8. $db_danee["db"] = 
  9. $connection = mysql_connect($db_danee['hostname'], $db_danee['user'], $db_danee['password']);
  10. @mysql_select_db($db_danee['db']);
  11. $sqltest="SELECT tytul FROM `mp3` LIMIT 1 "; 
  12. $res = mysql_query ($sqltest); 
  13. $res = mysql_fetch_array ($res);
  14. //var_dump($res);
  15. print_r ($res);
  16. //exit;
  17.  
  18. if (!is_null($res)) { echo 'baza 1'; }
  19. else { echo 'baza 2'; }
  20.  
  21. ?>


Przy zablokowanej bazie1 zawraca mi:

Array ( [0] => Say say say mega miX energy [tytul] => Say say say mega miX energy ) baza 1

No jakim cudem.
Czy nikt na forum.php.pl nie wie exclamation.gifquestionmark.gif
cojack
dodaj do if'a
  1. <?php
  2. ?>
przed
  1. <?php
  2. }
  3. ?>

i na bank echo baza1 nie zadziała jak baza jeden jest zawieszona tongue.gif
majestiq
Tutaj problem jest gdzie indziej...
Nawet jak wytnę z w/w kodu fragment połączenia z baza:

  1. <?php
  2. $db_danee["hostname"] = 
  3. $db_danee["user"] = 
  4. $db_danee["password"] = 
  5. $db_danee["db"] = 
  6.  
  7. $connection = mysql_connect($db_danee['hostname'], $db_danee['user'], $db_danee['password']);
  8. @mysql_select_db($db_danee['db']);
  9. ?>


i zostanie tylko:

  1. <?php
  2. error_reporting(E_ALL ^ E_WARNING ^ E_NOTICE );
  3.  
  4.  
  5. @mysql_select_db($db_danee['db']);
  6. $sqltest="SELECT tytul FROM `mp3` LIMIT 1 "; 
  7. $res = mysql_query ($sqltest); 
  8. $res = mysql_fetch_array ($res);
  9. //var_dump($res);
  10. print_r ($res);
  11. //exit;
  12.  
  13. if (!is_null($res)) { echo 'baza 1';}
  14. else { echo 'baza 2'; }
  15. ?>


to i tak echo zwraca: baza 1, tak jakby połączenie było już nawiązane!
Może to coś z sesją, ale chyba to sprawdzałem już.
W takim razie jak zmodyfikować ten kod, żeby w odpowiednim miejscu rozłączał się z bazą i łączył z tą bazą co trzeba a nie tą która już jest wybrana questionmark.gif
cojack
To może dodaj sobie wcześniej jeżeli używasz w każdym miejscu taką samą nazwę połączenia:
  1. <?php
  2. $zmienna_z_fetch_cos -> free();
  3. $connection -> close();
  4. ?>

A później nawiązuj połączenie

Jabym do Twojego kodu zastosował takie coś, bo mi się to z fetch_array nie podoba:
  1. <?php
  2. $ile_znalezionych = $res->num_rows;
  3. ?>

i przy if'ie wrzucił
  1. <?php
  2. if (!$ile_znalezionych) echo 'baza 1';
  3. else echo 'baza 2';
  4. ?>

frytki.
majestiq
Coś mi ten Twój kod też za bardzo nie działa, pyzatym nie za bardzo mogę stosować num rows bo mi strasznie bazę obciąża :/
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.