我正试图弄清楚如何在Travis CI测试运行之前更改MySQL配置。我们正在使用"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 failed to start",但我甚至不想使用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
所以,我不知道如何在Travis CI上完成更改MySQL配置,我尝试过的每一个互联网搜索和方法都失败了。
innodb_buffer_pool_size
在MySQL 5.7.5之前不能动态更改。你用的是什么版本?
在此版本之前,这里有一些选项:
- 修改
/etc/my.cnf
(或任何位置) - 假设my.cnf结尾有一个'include',那么暂时将一个文件添加到提到的目录中。需要
[mysqld]
和innodb_buffer_pool_size=512M
两条线;然后重启mysqld. - 添加
--innodb_buffer_pool_size=512M
到mysqld
的启动
其他"变量"可以动态设置,也可以不动态设置。分别研究。
我现在有一个。travis。允许您在不使用sudo
的情况下运行和重新启动mysqld
的yml配置-逻辑如下:
-
只是出于兴趣,为什么不能使用
sudo
? -
在
before_script
中使用wget
从https://dev.mysql.com/downloads/mysql/获取通用linux .tar.gz -将.tar.gz存储在将被缓存的目录中-如果文件已经存在,请不要这样做 -
将.tar.gz解包到缓存目录—如果解包目标已经存在,请不要这样做
-
清除错误日志并重新创建.cnf文件
-
现在在
script
中,第一次启动mysqld
,等待一点,检查它是否正在运行,然后停止它 -
对你想要的配置进行任何更改
-
第二次启动
mysqld
,等待一段时间,检查配置更改,然后停止 -
证明
.travis.yml
(mysql 5.6.40 generic linux 64位)在这里: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中的某些配置参数只能在服务器启动之前设置,即mysql 5.6中表14.13中为"dynamic: no"的任何东西-我重申明显的流程:PHP参数是通过PHP .ini 动态施加给PHP进程的。(从未测试过这个-不知道它是否有效-约束是'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参数之前,每个测试的运行时,作为不同的配置他们"永久"在测试实例数据库服务器测试?
假设您的配置travis在mysqld
通过services: mysql
在容器启动时发射?你可以before_install
或script
中专门启动mysqld
,并指定你想要的参数在开始时间,mysqld
在ci框架travis
下运行(我认为这应该允许它启动/停止/重新启动等没有任何(见:https://github.com/knyrb/mysql-travisci为概念证明)sudo
的使用,但我还没有测试过它)参见:https://docs.travis-ci.com/user/database-setup/#MySQL,这暗示了可能性(尽管有jackrabbit),
no:必须运行
mysqld
作为root切换用户虽然你会运行(https://dev.mysql.com/doc/refman/5.6/en/server-options.html#option_mysqld_user),mysqld --user=travis
或者可能在cnf文件中使用(https://dev.mysql.com/doc/mysql-security-excerpt/5.6/en/changing-mysql-user.html)[mysqld] user=travis
指令
(从来没有测试过这个,但它应该工作得很好)另一个选择可能是有一个github项目为每个特定的环境测试你想要执行,mysqld配置为运行与它的限制参数已经设置:你的测试将每个容器,而不是临时重启(可能疯狂,取决于你有多想要它!)
(如果您的测试与性能相关,请记住在开始测量之前给数据库一些预热查询)
我纯粹出于兴趣而问:当涉及到测试不同的环境和配置限制时,我的拙见总是倾向于"多即是多"的方法!
(从未测试过这个)不确定你是否使用mysql的最新版本,这个选项的工作,但我看到有一个指令在mysql 8restart
这可能适合你,如果你可以让一个mysql存储进程触发数据库服务的重启,从一个特权帐户调用一个存储进程-你会调用这个存储进程,然后等待服务器重启,说用以下方法之一:
对
sleep
的调用在证明中完成了工作(它不会解释失败-但是如果任何进程返回!= 0,则ci构建失败)如果您使用本地unix/domain套接字,请使用以下任何方法等待文件
/tmp/mysql.sock
(或等效的):https://superuser.com/questions/878640/unix-script-wait-until-a-file-existswhile .. sleep
,来自inotify工具的inotifywait
;或者在python内部使用inotify.adapters.InotifyTree().eventgen()
(可能有点夸张!)使用宽限超时尝试连接,
mysql -S/tmp/mysql.sock --connect-timeout=# --user=youruser --password
https://stackoverflow.com/a/21189440/4036945 (
wait .. sleep
使用curl
打到一个网络服务,反过来连接到数据库:也许你的应用程序有一个"状态"页面?也许它等待一段时间,并在返回到HTTP客户端之前重新尝试数据库连接)https://unix.stackexchange.com/a/5279 (
wait .. sleep
使用netcat
,netstat
和lsof
,但我认为这些都需要sudo
,除非你从ci框架内启动mysql,其中netstat
从ci框架应该提供信息)