php mysql travis-ci

php - Cómo agregar a la configuración de MySQL en Travis CI cuando no sudo



travis-ci (2)

Estoy tratando de averiguar cómo cambiar la configuración de MySQL antes de una prueba de Travis CI. Estamos usando la directiva "sudo: false", creo que para usar contenedores ... No soy la mejor persona en devops.

Pero incluso cuando establezco sudo en verdadero, no puedo reiniciar MySQL después de intentar agregar líneas a "/etc/mysql/my.cnf".

Asi que,

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

me da: "inicio: el trabajo no se pudo iniciar", pero ni siquiera quiero usar sudo. Para la configuración de PHP, puedo hacer algo como:

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

pero no puedo ver nada en mi carpeta de inicio sobre MySQL.

También sé sobre

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

Pero las cosas que quiero poner me dan:

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

Por lo tanto, no sé cómo lograr cambiar la configuración de MySQL en Travis CI, y todas las búsquedas y los métodos de Internet que he probado me han fallado.


Presento una configuración de .travis.yml que le permite ejecutar y reiniciar mysqld sin usar sudo . La lógica es la siguiente:

  • solo por interés, ¿por qué no puedes usar sudo ?

  • obtenga el linux genérico .tar.gz de https://dev.mysql.com/downloads/mysql/ en before_script usando wget : almacene el .tar.gz dentro de un directorio que se almacenará en caché; no haga esto si el archivo ya existe

  • descomprima el archivo .tar.gz en el directorio almacenado en caché; no haga esto si el destino de desempaquetado ya existe

  • arrastre el registro de errores y vuelva a crear el archivo .cnf

  • ahora en el script , inicie mysqld por primera vez, espere un poco, verifique que esté funcionando y luego deténgalo

  • Haz cualquier cambio a la configuración que quieras

  • inicie mysqld por segunda vez, espere un poco, compruebe el cambio de configuración y luego deténgalo

  • la prueba .travis.yml (mysql 5.6.40 linux genérico de 64 bits) está aquí: https://github.com/knyrb/mysql-travisci/blob/master/.travis.yml - aquí hay un ) idea aproximada de los contenidos:

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"

discusión dejada para la posteridad:

Como lo ha identificado, hay ciertos parámetros de configuración en mysql que solo se pueden configurar antes de que el servidor comience. todo lo que sea ''dinámico: no'' en la tabla 14.13 para mysql 5.6 - reitero el fwiw obvio: los parámetros php se infligen dinámicamente en el proceso php a través de php.ini

(nunca probé esto; no sé si funciona; la restricción fue ''no sudo'' y este método claramente requiere sudo ) primero, ¿has intentado usar el binario de service ( https://linux.die.net/man/8/service ) en lugar de una llamada directa a mysql ? verbigracia. 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

¿Qué caso (s) está probando al cambiar estos parámetros de mysql antes del tiempo de ejecución de cada prueba, a diferencia de configurarlos ''permanentemente'' en el servidor db de instancia de prueba?

  • asumiendo que su mysqld está mysqld al inicio del contenedor a través de services: mysql ? podría configurar travis para iniciar mysqld específicamente en before_install o script y especificar los parámetros que desea en el momento de inicio, con mysqld ejecutándose bajo el ci framework travis (creo que esto debería permitirle iniciar / detener / reiniciar, etc. sin su uso de sudo , pero no lo he probado ( vea: https://github.com/knyrb/mysql-travisci para una prueba de concepto )

  • (nunca probé esto, pero debería funcionar también) otra opción podría ser tener un proyecto github para cada prueba de entorno específico que desee realizar, con mysqld configurado para ejecutarse con sus parámetros limitantes ya establecidos: sus pruebas serán por contenedor, en lugar de que con reinicios provisionales (posiblemente una locura, dependiendo de lo mal que lo quieras!)

  • (Si sus pruebas están relacionadas con el rendimiento, recuerde proporcionar a la db una / algunas consultas de calentamiento antes de comenzar a medir)

  • Lo pregunto por simple interés: cuando se trata de probar diferentes entornos y límites de configuración, ¡mi humilde opinión siempre favorecerá un enfoque de "más es más"!

(nunca probé esto tampoco) no estoy seguro si está usando una versión suficientemente reciente de mysql para que funcione esta opción, pero veo que hay una instrucción en mysql 8 restart

esto podría funcionar para usted si puede hacer que un proceso almacenado de mysql desencadene un reinicio del servicio de base de datos desde una cuenta privilegiada que llame a un proceso almacenado: usted llamará a este proceso almacenado y esperará a que se reinicie el servidor, por ejemplo, con uno de los siguientes métodos :

  • una llamada a la sleep hizo el trabajo en la prueba (no se considerará un error, pero la compilación ci falla si se devuelve algún proceso! = 0)

  • Si usa un socket de dominio / Unix local, espere en el archivo /tmp/mysql.sock (o su equivalente) usando cualquiera de los métodos aquí: https://superuser.com/questions/878640/unix-script-wait-until-a-file-exists while .. sleep , inotifywait de las herramientas inotify; o desde dentro de python usando inotify.adapters.InotifyTree().eventgen() (¡probablemente exagerando!)

  • intente una conexión con un tiempo de espera generoso, mysql -S/tmp/mysql.sock --connect-timeout=# --user=youruser --password

  • https://.com/a/21189440/4036945 ( wait .. sleep usando curl para encontrar un servicio web que a su vez se conecte a la base de datos: tal vez su aplicación tenga una página de ''estado'' y quizás espere un rato y reintenta una conexión db antes de que regrese al cliente http)

  • https://unix.stackexchange.com/a/5279 ( wait .. sleep usando netcat , netstat y lsof , pero creo que todos necesitarán sudo menos que inicie mysql desde el marco ci, en el cual netstat desde el marco ci debe proporcionar la información)


innodb_buffer_pool_size no puede cambiarse dinámicamente hasta MySQL 5.7.5. Qué versión estás usando?

Antes de esa versión, aquí hay algunas opciones:

  • Modificar /etc/my.cnf (o donde sea que esté ubicado)
  • Suponiendo que my.cnf tenga una ''inclusión'' al final, a continuación, agregue temporalmente un archivo al directorio mencionado. Necesita 2 líneas [mysqld] e innodb_buffer_pool_size=512M ; entonces reinicie mysqld.
  • Agregue --innodb_buffer_pool_size=512M al lanzamiento de mysqld .

Otras "VARIABLES" pueden, o no, ser configurables dinámicamente. Investiga cada uno por separado.