Как добавить в конфигурацию MySQL на Travis CI, когда не Sudo

Я пытаюсь выяснить, как изменить конфигурацию MySQL перед тестовым запуском Travis CI. Мы используем директиву "sudo: false", я думаю, использовать контейнеры... Я не лучший человек.

Но даже когда я устанавливаю sudo на true, я не могу перезапустить MySQL после того, как я попытаюсь добавить строки в "/etc/mysql/my.cnf".

Так,

  - cat "some/directory/my.cnf" | sudo tee -a /etc/mysql/my.cnf
  - sudo /etc/init.d/mysql restart

дает мне: "start: Job не удалось запустить", но я даже не хочу использовать sudo. Для конфигурации PHP я могу сделать что-то вроде:

  - echo "apc.shm_size=256M" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini

но я ничего не вижу в своей домашней папке о MySQL.

Я также знаю о:

  - mysql -e "SET GLOBAL innodb_buffer_pool_size = 512M;"

но вещи, которые я хочу настроить, дают мне:

  ERROR 1238 (HY000) at line 1: Variable 'innodb_buffer_pool_size' is a read only variable

Итак, я не понимаю, как выполнить изменение конфигурации MySQL на Travis CI, и каждый интернет-поиск и метод, которые я пробовал, подвели меня.

Ответ 1

Я представляю конфигурацию.travis.yml, которая позволяет запускать и перезапускать mysqld без использования sudo - логика идет по строкам:

  • просто из интереса, почему вы не можете использовать sudo?

  • получить общий linux.tar.gz с https://dev.mysql.com/downloads/mysql/ в before_script с помощью wget - сохранить.tar.gz в каталоге, который будет кэшироваться - не делайте этого, если файл уже существует

  • распакуйте.tar.gz в кеш-каталог - не делайте этого, если цель распаковки уже существует

  • очистить журнал ошибок и воссоздать файл.cnf

  • теперь в script, запустите mysqld в первый раз, дождитесь бит, убедитесь, что он работает, а затем остановите его

  • внесите любые изменения в конфигурацию, которую вы хотите

  • запустить mysqld во второй раз, дождаться бит, проверить изменение конфигурации, а затем остановить его

  • доказательство .travis.yml (mysql 5.6.40 generic linux 64-bit) находится здесь: https://github.com/knyrb/mysql-travisci/blob/master/.travis.yml - вот (неработающий ) грубое представление о содержании:

before_script:
  <..snip..>
  - if [ -f 'scripts/mysql_install_db' ]; then ./scripts/mysql_install_db --defaults-file="$TCI_D_MYSQL_ROOT/my.cnf"; fi

script:
  <..snip..>
  - bin/mysqld --defaults-file="$TCI_D_MYSQL_ROOT/my.cnf" --socket=/tmp/.thesock &
  - bin/mysqladmin --defaults-file="$TCI_D_MYSQL_ROOT/my.cnf" --socket=/tmp/.thesock ping
  - export TCI_MYSQL_PID_1="'cat $TCI_D_MYSQL_ROOT/mysql.pid'"
  - kill -SIGTERM $TCI_MYSQL_PID_1
  <..snip..>

after_success:
  <..snip..>

after_failure:
  <..snip..>
  - cat "$TCI_D_MYSQL_ROOT/mysql.err"

обсуждение осталось для потомков:

как вы определили, в mysql есть определенные параметры конфигурации, которые могут быть установлены только до запуска сервера, а именно. все, что является "динамическим: нет" в таблице 14.13 для mysql 5.6 - я повторяю очевидное fwiw: параметры php динамически накладываются на процесс php через php.ini


(никогда не тестировал это - не знаю, работает ли это - ограничение было "no sudo", и этот метод явно требует sudo), вы пробовали использовать service двоичный файл (https://linux.die.net/man/8/service) вместо прямого вызова mysql? а именно https://docs.travis-ci.com/user/database-Setup/#MySQL-5.7:

before_install:
- sudo mysql -e "use mysql; update user set authentication_string=PASSWORD('new_password') where User='root'; update user set plugin='mysql_native_password';FLUSH PRIVILEGES;"
- sudo mysql_upgrade
- sudo service mysql restart

какой случай вы тестируете, изменяя эти параметры mysql перед каждой тестовой версией, отличной от настройки "постоянно" на сервере db тестового экземпляра?

  • предполагая, что ваш mysqld запускается при запуске контейнера через services: mysql? вы могли бы настроить travis для запуска mysqld специально в before_install или script и указать параметры, которые вы хотите во время запуска, а mysqld работает под travis ci framework (я думаю, что это должно позволить ему запускать/останавливать/перезапускать и т.д. без какого-либо использования sudo, но я его не тестировал) (см. https://github.com/knyrb/mysql-travisci для доказательства концепции)

  • (никогда не тестировал это, но он также должен был работать), другой вариант может заключаться в том, чтобы иметь проект github для каждого конкретного теста среды, который вы хотите выполнить, при этом mysqld настроен на запуск с уже установленными предельными параметрами: ваши тесты будут на один контейнер, а чем с промежуточными перезапусками (возможно, безумными, в зависимости от того, насколько вам это плохо)!

  • (если ваши тесты связаны с производительностью, не забудьте дать db a/некоторые разминочные запросы перед началом измерения)

  • я спрашиваю чисто из интереса: когда дело доходит до тестирования разных условий и ограничений конфигурации, мое скромное мнение всегда будет поддерживать подход "больше - больше"!


(никогда не тестировал это тоже) не уверен, что вы используете последнюю версию mysql для этой опции, но я вижу, что есть инструкция по restart mysql 8

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

  • вызов sleep выполнил задание в доказательстве (он не будет учитывать отказ), но ci build не удастся, если какой-либо процесс вернется! = 0)

  • если вы используете локальный сокет unix/domain, подождите файл /tmp/mysql.sock (или ваш эквивалент), используя любой из методов здесь: https://superuser.com/questions/878640/unix-Script- wait- inotifywait -a-file-exists while.. sleep, inotifywait из инструментов inotify; или изнутри python, используя inotify.adapters.InotifyTree().eventgen() (возможно, overkill!)

  • mysql -S/tmp/mysql.sock --connect-timeout=# --user=youruser --password соединение с mysql -S/tmp/mysql.sock --connect-timeout=# --user=youruser --password таймаутом, mysql -S/tmp/mysql.sock --connect-timeout=# --user=youruser --password

  • fooobar.com/questions/112308/... (wait.. sleep используя curl чтобы попасть в веб-сервис, который, в свою очередь, подключается к db: возможно, ваше приложение имеет страницу статуса и возможно ждет некоторое время и повторяет соединение db, прежде чем он вернется к http-клиенту)

  • https://unix.stackexchange.com/a/5279 (wait.. sleep используя netcat, netstat и lsof, но они, я думаю, все потребуют sudo если вы не запустите mysql изнутри ci framework, в котором netstat из ci framework должен предоставить информацию)

Ответ 2

innodb_buffer_pool_size не может динамически изменяться до MySQL 5.7.5. Какую версию ты используешь?

Перед этой версией, вот несколько вариантов:

  • Измените /etc/my.cnf (или где бы он ни находился)
  • Предполагая, что my.cnf имеет "include" в конце, затем временно добавьте файл в указанный каталог. Ему нужны 2 строки [mysqld] и innodb_buffer_pool_size=512M; затем перезапустите mysqld.
  • Добавьте --innodb_buffer_pool_size=512M к запуску mysqld.

Другие "ПЕРЕМЕННЫЕ" могут или не могут быть динамически настраиваемыми. Исследование каждого отдельно.