manticoresoftware / manticoresearch

Easy to use open source fast database for search | Good alternative to Elasticsearch now | Drop-in replacement for E in the ELK soon
https://manticoresearch.com
GNU General Public License v3.0
8.95k stars 497 forks source link

Fatal при альтеринге таблицы #1752

Open vaslatyshev opened 8 months ago

vaslatyshev commented 8 months ago

Конфиг manticore:

common {
    plugin_dir = /usr/local/lib/manticore
}
searchd {
    listen = 10.9.2.19:9312
    listen = 10.9.2.19:9306:mysql
    listen = 10.9.2.19:9308:http
    listen = 10.9.2.19:9322-9325:replication
    log = /var/log/manticore/searchd.log
    query_log = /var/log/manticore/query.log
    pid_file = /var/run/manticore/searchd.pid
    data_dir = /var/lib/manticore
    query_log_format = sphinxql
    query_log_min_msec  = 500
    query_log_mode = 644
    node_address = 10.9.2.19
    max_batch_queries = 0
    max_packet_size = 128M
    thread_stack = 16M
    binlog_flush = 0
    binlog_max_log_size = 16M
    binlog_path = # disable logging
    threads = 46
    collation_server = utf8_ci
    network_timeout = 300s
    sphinxql_timeout = 30m
    client_timeout = 1h
    secondary_indexes = 0
    telemetry = 0
}

При альтре таблицы manticore перезагрузился и "убил" индекс. Запрос на ALTER:

ALTER TABLE products ADD COLUMN school_purpose_id int

Лог searchd manticore.log

После выполнения ALTER - индекс оказался сломан. Посмотреть добавилось ли новое поле или нет - не смогли. Пришлось пересоздать индекс, применить ALTER для пустой таблицы и заново его заполнить. В чем может быть проблема и как безопасно делать альтеры?

sanikolaev commented 8 months ago

как безопасно делать альтеры?

Не игнорировать:

image

Попробуйте в сторонке. Если:

, то отправьте нам файлы таблицы - будем фиксить.

tomatolog commented 8 months ago

так же может быть полезным сделать indextool -c your.conf --check nds перед началом выполнения ALTER чтобы убедиться, что индекс валидный

tomatolog commented 8 months ago

в вашем логе есть уже строчки

WARNING: table 'products': prealloc: attribute count mismatch (..., myattrs=134, inattrs=135)

те как будто у таблицы products диск чанк 3047 тоже не валидный.

Лучше проверить все индексы поочереди с indextool чтобы убедится что у вас валидные данные

vaslatyshev commented 8 months ago

В следующий раз перед выполнением ALTER сделаем проверку индекса и я добавлю сюда детали. Сейчас данные не сохранились, как я написал выше - пересоздали индекс и наполнили заново.

vaslatyshev commented 8 months ago

так же может быть полезным сделать indextool -c your.conf --check nds перед началом выполнения ALTER чтобы убедиться, что индекс валидный

Появилась потребность произвести очердные альтеры. Если результат проверки покажет, что индекс невалидный, какие рекомендации по восстановлению индекса перед альтером?

tomatolog commented 8 months ago

выполнить truncate и вставить данные заново или проиндексировать данные в plain table и сделать ATTACH ... WITH TRUNCATE

Если вы сможете поймать последовательность действий, которая приводит к невалидному индексу, то мы сможет начать расследование и починить этот кейс.

vaslatyshev commented 8 months ago

выполнить truncate и вставить данные заново или проиндексировать данные в plain table и сделать ATTACH ... WITH TRUNCATE

Если вы сможете поймать последовательность действий, которая приводит к невалидному индексу, то мы сможет начать расследование и починить этот кейс.

я правильно понимаю, что такое решение подразумевает простой (пока не наполнится индекс)? С минимальным простоем это решение через plain индекс?

tomatolog commented 8 months ago

да простой будет минимальный при индексации plain индекс и присоединении его