MySQL сервер исчез, несогласованная ошибка, вызванная одним скриптом - PullRequest
0 голосов
/ 09 марта 2020

У меня есть сценарий PHP, который запускает запрос SQL, который занимает несколько секунд и возвращает около 15K + результатов после сложного вычисления на основе данных, найденных в таблице БД на моем сервере, с именем * 1001. *.

После получения результатов предполагается вставить (используя замену) эти записи в другую таблицу БД на моем сервере.

Сценарий, используемый для безупречной работы, когда table был простой основной стол. Позже я изменил запрос SQL, чтобы использовать данные из таблицы VIEW, мы можем назвать ее view_table, которая основана на table, но имеет дополнительный столбец, который рассчитывается на лету.

Это заставил скрипт начать сбой всего моего SQL сервера, каждый раз в какое-то время, выдав эту ошибку:

PHP Предупреждение: mysqli :: query (): MySQL сервер пропал в /home/user/script.php в строке 109

Ниже находится строка 109:

function getRecordsFromDB(){
    logMemoryUtilizationDetails();
    file_put_contents(LOG_DIRECTORY.'service.log', date("d/m:H:i").':'."getRecordsFromDB::Entry".PHP_EOL, FILE_APPEND);
    global $sourceConn;
    $selectQuery = file_get_contents(__DIR__.'/my-query.sql');
    $items = array();
    $result = $sourceConn->query($selectQuery); // LINE 109
    if ($result){
        if ($result->num_rows > 0) {

            while($row = $result->fetch_assoc()) {
                $item = new Item();
                $item->id               = $row['id'];
                $item->itemId               = $row['itemid'];

Я попытался войти в систему, чтобы увидеть, сколько памяти занимает скрипт используйте при запуске и выходе, и когда он успешен, он использует около 37 МБ ОЗУ на пике.

Мой сервер имеет 6 ГБ ОЗУ на 4 ядрах.

Другого нет скрипт, работающий на моем сервере, который вызывает SQL сбой сервера, вот так, поэтому я уверен, что этот скрипт вызывает cra sh.

Вот MY.CNF моего сервера:

[mysqld]
# disable mysql strict mode
sql_mode=""

log-error=/var/lib/mysql/host.myhost.com.err
performance_schema=1

query_cache_type=0
query_cache_size=0
query_cache_limit=0

key_buffer_size=16M
max_connections=200
max_tmp_tables=1
table_open_cache=2000
local-infile=0
thread_cache_size=4
innodb_file_per_table=1
default-storage-engine=MyISAM
innodb_use_native_aio=0
max_allowed_packet=1024M
innodb_buffer_pool_size=800M
open_files_limit=10000
#wait_timeout=500
tmp_table_size=256M
max_heap_table_size=256M
innodb_buffer_pool_instances=1
#general_log=on
#general_log_file = /var/lib/mysql/all-queries.log

slow-query-log=0
slow-query-log-file=/var/lib/mysql/slow_queries.log
long_query_time=1.0
#log_queries_not_using_indexes=1

И это из моего PHP .INI (для PHP 7.2, который я использую):

max_execution_time = 240

max_input_time = 60

max_input_vars = 1000

memory_limit = 512M


[MySQLi]

mysqli.max_persistent = -1

;mysqli.allow_local_infile = On

mysqli.allow_persistent = On

mysqli.max_links = -1

mysqli.cache_size = 2000

mysqli.default_port = 3306

mysqli.default_socket =

mysqli.default_host =

mysqli.default_user =

mysqli.default_pw =

mysqli.reconnect = Off

Я не вижу * 10 32 * в этих файлах.

У меня есть много других сценариев, и все они работают нормально, поэтому я не хотел бы что-то менять глобально, так как боюсь, что это может вызвать другие проблемы на моем сервере.

1 Ответ

1 голос
/ 09 марта 2020

Похоже на тайм-аут или неудачный запрос. Пожалуйста, вставьте sql запрос, который вы используете. Вы также можете попытаться увидеть, где запрос может вызвать это, вставив запрос в вашу mysql IDE (Navicat - мой любимый) и добавив к нему «объяснение расширенного» (без кавычек). Таким образом, ваш запрос будет выглядеть как «объяснить расширенный выбор ... (все 300 строк)». Ищите ключи выше 4, никаких первичных ключей и строк, запрашиваемых с действительно большими числами для начинающих. Кроме того, похоже, что вместо представления вы можете рассмотреть возможность создания хранимой процедуры, в которой вы можете выбрать все во временную таблицу и затем вычислить значение «на лету» в следующем запросе. Конечно, вам нужно настроить my.cnf для распознавания временной таблицы, чтобы она могла уничтожить ее после завершения сеанса. Кроме того, если у вас есть какая-либо репликация или кластер серверов, обязательно остановите binlog перед созданием временной таблицы, а затем запустите ее, как только ваши запросы будут завершены, и ваш сеанс будет закрыт.

Если хотите, пожалуйста, вставьте свой my.cnf (mysql файл конфигурации), чтобы убедиться, что ваша конфигурация оптимальна для большого запроса.

Кроме того, для устранения неполадок вы можете временно увеличить максимальное время выполнения в php .ini.

...