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
usandowget
: almacene el .tar.gz dentro de un directorio que se almacenará en caché; no haga esto si el archivo ya existedescomprima 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
, iniciemysqld
por primera vez, espere un poco, verifique que esté funcionando y luego deténgaloHaz 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éngalola 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 sumysqld
estámysqld
al inicio del contenedor a través deservices: mysql
?podríaconfigurar travis para iniciarmysqld
específicamente enbefore_install
oscript
y especificar los parámetros que desea en el momento de inicio, conmysqld
ejecutándose bajo el ci frameworktravis
(creo que esto debería permitirle iniciar / detener / reiniciar, etc. sin su uso de( vea: https://github.com/knyrb/mysql-travisci para una prueba de concepto )sudo
, pero no lo he probadovea: https://docs.travis-ci.com/user/database-setup/#MySQL , que sugiere la posibilidad (aunque con jackrabbit),
no: debe ejecutar
mysqld
como root para cambiar de usuario,aunque ejecute( https://dev.mysql.com/doc/refman/5.6/en/server-options.html#option_mysqld_user ),mysqld --user=travis
o tal vez en el archivo cnf con( https://dev.mysql.com/doc/mysql-security-excerpt/5.6/en/changing-mysql-user.html )[mysqld] user=travis
directiva[mysqld] user=travis
(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-existswhile .. sleep
,inotifywait
de las herramientas inotify; o desde dentro de python usandoinotify.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
usandocurl
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
usandonetcat
,netstat
ylsof
, pero creo que todos necesitaránsudo
menos que inicie mysql desde el marco ci, en el cualnetstat
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]
einnodb_buffer_pool_size=512M
; entonces reinicie mysqld. - Agregue
--innodb_buffer_pool_size=512M
al lanzamiento demysqld
.
Otras "VARIABLES" pueden, o no, ser configurables dinámicamente. Investiga cada uno por separado.