동일한 2 개의 쿼리를 3 개의 테이블에 적용하므로 루프를 반복하고 테이블 이름을 대체합니다. 첫 번째 INSERT 쿼리는 항상 테스트 서버와 프로덕션에서 작동합니다. 두 번째 DELETE 쿼리는 두 개의 다른 테스트 서버에서 작동하지만 프로덕션에서 실패하고 mysql 오류 1046 No database selected가 발생합니다.
영향을받는 코드 추출 :
$queries = array(
"INSERT INTO knd_bkg.@table@
SELECT DISTINCT SQL_NO_CACHE
B.ASIN, Author, Title, EditorialReview, DetailPageURL, current_price, salesrank, number_reviews, erotica, G.BrowseNodeId, price_salesrank_checked_on
FROM bkd_books.club_books B
USE INDEX (free_quality)
RIGHT JOIN bkd_books.book_genre G on G.ASIN=B.ASIN
WHERE EXISTS
(
SELECT 1 FROM knd_bkg.genres K WHERE K.browsenode=G.BrowseNodeId
)
AND @priceWhere@
AND price_salesrank_checked_on > '@newerThan@'
AND B.number_reviews >= 4
AND B.rating >= 4.0
AND B.language = 'english'
AND B.hide_knd=0
AND B.public_domain=0;",
"DELETE T FROM knd_bkg.@table@ T
INNER JOIN
(
SELECT N.* FROM knd_bkg.@table@ N
INNER JOIN
(
SELECT DISTINCT ASIN, BrowseNodeId FROM knd_bkg.@table@
INNER JOIN knd_bkg.genres ON knd_bkg.genres.browsenode=knd_bkg.@[email protected]
WHERE isFiction=1
) F
ON F.ASIN=N.ASIN
INNER JOIN knd_bkg.genres
ON knd_bkg.genres.browsenode=N.BrowseNodeId
WHERE knd_bkg.genres.isNonFiction=1
) D
USING (ASIN, BrowseNodeId)
WHERE D.ASIN=T.ASIN AND D.BrowseNodeId=T.BrowseNodeId"
);
$tables = array(
"free_books" => array('priceWhere' => "B.current_price = 0", 'timePeriod' => $freeTimePeriod),
"99_books" => array('priceWhere' => "B.current_price > 0 AND B.current_price < 100", 'timePeriod' => $paidTimePeriod),
"399_books" => array('priceWhere' => "B.current_price >= 100 AND B.current_price < 400", 'timePeriod' => $paidTimePeriod),
);
connectSlaveDB();
foreach ($tables as $table => $data) {
$newerThan = date("Y-m-d H:i:s", strtotime("-" . $data['timePeriod'] . " hours"));
foreach ($queries as $query) {
$query = str_replace('@table@', $table, $query);
$query = str_replace('@newerThan@', $newerThan, $query);
$query = str_replace('@priceWhere@', $data['priceWhere'], $query);
Logger::_write(LOG_VERBOSE, "API - api/bkg/rebuild query: $query");
$result = mysql_query($query);
if (!$result) {
Logger::_write(LOG_ERR, "API - api/bkg/rebuild FAILED: " . mysql_error());
$success = false;
} else {
Logger::_write(LOG_VERBOSE, "API - api/bkg/rebuild SUCCESS");
}
}
}
그리고 connectSlaveDB ()
function connectSlaveDB()
{
global $dbSlave, $dbUser, $dbPass, $dbName;
$connSlave = mysql_connect($dbSlave, $dbUser, $dbPass, TRUE);
if (!$connSlave) {
Logger::_write(LOG_CRIT, "Unable to connect to slave DB");
include 'screens/error.inc.php';
exit();
}
mysql_set_charset('utf8', $connSlave);
mysql_select_db($dbName, $connSlave);
return TRUE;
}
테이블은 MEMORY 테이블이지만 MYISAM과 프로덕션에서만 동일한 오류가 발생합니다. 이 쿼리는 복제 슬레이브에서 실행되고 마스터를 포함하지 않지만 이전 코드는 테이블을 TRUNCATES 때문에 권한이 있다고 생각하지 않습니다. 로그 파일에서 쿼리를 가져 오면 phpMyAdmin에서 제대로 작동합니다. 그리고 테스트 서버에서는 괜찮습니다.
1046 No database selected 오류에 대한 이유를 알 수 없습니다. 그리고 3 시간 후에는 정말 분명한 것을 놓칠 수 있습니다. 특히 하나의 DB 연결에 대한 실패 패턴은 다음과 같습니다.
INSERT on free_books - success
DELETE on free_books - fail
INSERT on 99_books - success
DELETE on 99_books - fail
INSERT on 399_books - success
DELETE on 399_books - fail
추악한 전역과 더 이상 사용되지 않는 mysql * 함수를 용서하십시오. 이것은 다소 오래된 레거시 앱입니다. 알아...
DELETE 쿼리 구문으로 인해 문제가 발생할 수 있습니다.
DELETE T FROM
나는 이것이 mysql 버그로 인해 때때로 UPDATE 쿼리에 문제를 일으킨다는 것을 알고 있습니다.
T
참조 를 피하기 위해 쿼리를 다시 작성 하면이 문제가 해결됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다