我试图弄清楚如何在Travis CI测试运行之前更改MySQL配置。我们正在使用“sudo:false”指令,我认为使用容器......我不是最好的devops人。
但即使我将sudo设置为true,我尝试向“/etc/mysql/my.cnf”添加行后也无法重启MySQL。
所以,
- cat "some/directory/my.cnf" | sudo tee -a /etc/mysql/my.cnf
- sudo /etc/init.d/mysql restart
告诉我:“开始:工作未能启动”,但我甚至不想使用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配置感到茫然,而且我尝试的每一个互联网搜索和方法都让我失望。
答案 0 :(得分:4)
我提供了一个.travis.yml配置,允许您在不使用mysqld
的情况下运行并重新启动sudo
- 逻辑如下:
只是出于兴趣,为什么不能使用sudo
?
使用before_script
从wget
中的https://dev.mysql.com/downloads/mysql/获取通用linux .tar.gz - 将.tar.gz存储在将被缓存的目录中 - 不要如果文件已存在,请执行此操作
将.tar.gz解压缩到缓存目录 - 如果unpack目标已经存在,请不要这样做
清除错误日志并重新创建.cnf文件
现在在script
,第一次启动mysqld
,等待一下,检查它是否正在运行,然后停止
对您想要的配置进行任何更改
第二次启动mysqld
,等待一下,检查配置更改,然后停止
证明.travis.yml
(mysql 5.6.40通用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,table 14.13中的任何“动态:否” - 我重申了明显的fwiw:php参数是通过 php.ini
动态地在php进程中造成的(从未测试过这个 - 不知道它是否有效 - 约束是'没有sudo',这个方法显然需要sudo
)首先关闭,你尝试过使用service
二进制文件({ {3}})而不是直接调用mysql
?即https://linux.die.net/man/8/service:
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
启动?你可以mysqld
或before_install
专门启动script
并在开始时指定你想要的参数,并在ci框架下运行mysqld
travis
(我认为这应该允许它在没有(参见:{ {3}}用于概念验证)sudo
使用的情况下启动/停止/重启等,但我还没有测试过它)
请参阅:https://docs.travis-ci.com/user/database-setup/#MySQL-5.7,提示可能性(尽管有长耳兔),
否:必须以root身份运行mysqld
以切换用户 ,但您可以运行(https://github.com/knyrb/mysql-travisci) ,mysqld --user=travis
或者可能在cnf文件中带有(https://docs.travis-ci.com/user/database-setup/#MySQL)[mysqld] user=travis
指令
(从未对此进行测试,但它也可以正常工作)另一个选项可能是为每个要执行的特定环境测试创建一个github项目,并将mysqld配置为运行并设置其限制参数:您的测试将是每个容器,而不是临时重启(可能是疯了,取决于你想要它有多糟糕!)
(如果您的测试与性能相关,请记住在开始测量之前给db一个/一些热身查询)
我纯粹是出于兴趣:在测试不同的环境和配置限制时,我的拙见总是倾向于“更多更多”的方法!
(从未对此进行过测试)不确定你是否使用最新版本的mysql来使用此选项,但我看到mysql 8中有一条指令https://dev.mysql.com/doc/refman/5.6/en/server-options.html#option_mysqld_user
这可能对你有用,如果你有一个mysql存储过程触发器从一个调用存储过程的priveleged帐户重启数据库服务 - 你会调用这个存储过程然后等待服务器重启,比如说其中一个以下方法:
对sleep
的调用完成了证明中的工作(它不会导致失败 - 但如果任何进程返回,则ci构建失败!= 0)
如果您使用本地unix / domain套接字,请使用以下任何方法等待文件/tmp/mysql.sock
(或等效文件):https://dev.mysql.com/doc/mysql-security-excerpt/5.6/en/changing-mysql-user.html while .. sleep
,{{来自inotify工具的1}};或者使用inotifywait
来自python内部(可能是矫枉过正!)
尝试使用超时超时inotify.adapters.InotifyTree().eventgen()
restart
(mysql -S/tmp/mysql.sock --connect-timeout=# --user=youruser --password
使用wait .. sleep
来点击一个网络服务,然后连接到数据库:也许你的应用程序有一个“状态”页面?也许它等待一段时间,并在返回到http客户端之前重试数据库连接)
https://superuser.com/questions/878640/unix-script-wait-until-a-file-exists(curl
使用wait .. sleep
,netcat
和netstat
,但我认为这些都需要lsof
,除非您从ci框架内启动mysql,其中来自ci框架的sudo
应该提供信息)
答案 1 :(得分:3)
innodb_buffer_pool_size
无法动态更改。你用的是哪个版本?
在该版本之前,以下是一些选项:
/etc/my.cnf
(或其位置)[mysqld]
和innodb_buffer_pool_size=512M
;然后重新启动mysqld。--innodb_buffer_pool_size=512M
添加到mysqld
。其他“VARIABLES”可以动态设置,也可以不动态设置。分别研究每一个。