Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][MYSQL]Baza zablokowana, ... a jednak działa!?
majestiq
post 9.06.2008, 02:14:40
Post #1





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 26.10.2006

Ostrzeżenie: (0%)
-----


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


--------------------
Free mp3 download.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 15)
--szawel--
post 9.06.2008, 07:34:50
Post #2





Goście







co ci nigdy nie zwroci pustego wyniku zawsze kostaniesz komunikt o
bledzie
Go to the top of the page
+Quote Post
majestiq
post 9.06.2008, 10:27:20
Post #3





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 26.10.2006

Ostrzeżenie: (0%)
-----


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!!!


--------------------
Free mp3 download.
Go to the top of the page
+Quote Post
sniezny_wilk
post 9.06.2008, 10:31:59
Post #4





Grupa: Zarejestrowani
Postów: 732
Pomógł: 80
Dołączył: 25.05.2005
Skąd: Szczecin

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
majestiq
post 9.06.2008, 10:35:56
Post #5





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 26.10.2006

Ostrzeżenie: (0%)
-----


Bo jak włączam Phpmyadmina to widzę wyraźnie brak tabel i info na czerwono ze przekroczyłem limit czasu zapytań na godzine.


--------------------
Free mp3 download.
Go to the top of the page
+Quote Post
sniezny_wilk
post 9.06.2008, 10:45:04
Post #6





Grupa: Zarejestrowani
Postów: 732
Pomógł: 80
Dołączył: 25.05.2005
Skąd: Szczecin

Ostrzeżenie: (0%)
-----


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 ?


--------------------
Go to the top of the page
+Quote Post
nospor
post 9.06.2008, 10:48:50
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




  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()....


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
majestiq
post 11.06.2008, 13:11:28
Post #8





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 26.10.2006

Ostrzeżenie: (0%)
-----


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


--------------------
Free mp3 download.
Go to the top of the page
+Quote Post
cojack
post 11.06.2008, 15:08:28
Post #9





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


A nie lepiej to zrobić na sposób wytłumiania błędów przy połączeniu z bazą?


--------------------
cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena
Go to the top of the page
+Quote Post
majestiq
post 11.06.2008, 16:44:59
Post #10





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 26.10.2006

Ostrzeżenie: (0%)
-----


Możesz podać jakieś szczegóły questionmark.gif
(połączenie z bazą jest jako takie lecz jest ona 'wewnętrznie' zablokowana)


--------------------
Free mp3 download.
Go to the top of the page
+Quote Post
cojack
post 11.06.2008, 20:29:55
Post #11





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


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. ?>


Ten post edytował cojack 13.06.2008, 05:24:47


--------------------
cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena
Go to the top of the page
+Quote Post
majestiq
post 12.06.2008, 18:51:35
Post #12





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 26.10.2006

Ostrzeżenie: (0%)
-----


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


--------------------
Free mp3 download.
Go to the top of the page
+Quote Post
cojack
post 12.06.2008, 19:53:58
Post #13





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


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


--------------------
cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena
Go to the top of the page
+Quote Post
majestiq
post 12.06.2008, 22:48:28
Post #14





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 26.10.2006

Ostrzeżenie: (0%)
-----


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


--------------------
Free mp3 download.
Go to the top of the page
+Quote Post
cojack
post 13.06.2008, 05:18:49
Post #15





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


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.

Ten post edytował cojack 13.06.2008, 05:25:45


--------------------
cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena
Go to the top of the page
+Quote Post
majestiq
post 15.06.2008, 15:34:37
Post #16





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 26.10.2006

Ostrzeżenie: (0%)
-----


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 :/

Ten post edytował majestiq 15.06.2008, 15:34:51


--------------------
Free mp3 download.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 06:55