如何在Travis CI上进行MySQL配置(非Sudo用户)

17

我正在尝试找出如何在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

显示“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配置,每次尝试互联网搜索和方法都让我失望了。

2个回答

4

innodb_buffer_pool_size在MySQL 5.7.5之前不能动态更改。请问您使用的是哪个版本?

在此版本之前,有以下几种选项:

  • 修改/etc/my.cnf(或其他位置)
  • 假设my.cnf在末尾有一个'include',则临时添加一个文件到提到的目录中。它需要两行[mysqld]innodb_buffer_pool_size=512M,然后重新启动mysqld。
  • 在启动mysqld时添加--innodb_buffer_pool_size=512M

其他“变量”可能可以动态设置,也可能不行。请分别研究每个变量。


4
我提供一个.travis.yml配置,允许你在不使用sudo的情况下运行和重新启动mysqld - 逻辑如下:
  • 仅出于兴趣,为什么不能使用sudo

  • before_script中使用wgethttps://dev.mysql.com/downloads/mysql/获取通用的Linux .tar.gz文件 - 将.tar.gz文件存储在将被缓存的目录中 - 如果文件已经存在,则不要执行此操作。

  • 将.tar.gz解压缩到缓存目录中 - 如果解压缩目标已经存在,则不要执行此操作。

  • 清理错误日志并重新创建.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中有一些配置参数只能在服务器启动之前设置,即表14.13中对MySQL 5.6中任何“dynamic: no”的内容。我再次重申显而易见的事实:通过php.ini动态施加PHP参数于PHP进程。


(从未测试过-不知道是否有效-限制条件是“无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参数,与在测试实例数据库服务器中“永久”配置它们相比,您正在测试哪些案例?
  • 假设您的mysqld通过services: mysql在容器启动时启动? 您能否配置travis在before_installscript中特定启动mysqld并指定您想要的启动参数,使用mysqld运行在ci框架travis(我认为这应该允许它启动/停止/重新启动等而无需任何sudo使用,但我没有测试过) (参见: https://github.com/knyrb/mysql-travisci 作为概念证明)

  • (虽然从未测试过,但也应该有效)另一个选择可能是为您想要执行的每个特定环境测试创建一个github项目,其中mysqld已配置为使用其限制参数运行:您的测试将是每个容器而不是中间重启(根据您的需求程度可能非常疯狂!)

  • (如果您的测试与性能有关,请记得在开始测量之前给数据库一些预热查询)

  • 我纯粹出于兴趣问:当涉及测试不同的环境和配置限制时,我的谦逊意见总是支持“越多越好”的方法!


(从未测试过) 不确定您是否使用足够新的mysql版本以使此选项工作,但我看到mysql 8中有一条指令 restart

如果您可以使用MySQL存储过程触发器从特权帐户调用存储过程重新启动数据库服务,则此方法可能适用于您-然后您将调用此存储过程并等待服务器重新启动,例如以下方法之一:

  • 在证明中,调用sleep就可以完成任务(这不会解决失败的问题 - 但是如果任何进程返回 != 0,则ci构建将失败)

  • 如果您使用本地unix /域套接字,请使用此处的任何方法等待文件/tmp/mysql.sock(或其等效文件):https://superuser.com/questions/878640/unix-script-wait-until-a-file-exists while .. sleep,inotify工具包中的inotifywait; 或者使用inotify.adapters.InotifyTree().eventgen()在python内部(可能过度设计!)

  • 尝试连接并设置较长的超时时间:mysql -S/tmp/mysql.sock --connect-timeout=# --user=youruser --password

  • https://dev59.com/zWct5IYBdhLWcg3wqvTL#21189440 (使用curl等待..睡眠,以访问连接到数据库的Web服务:也许您的应用程序有一个“状态”页面?也许它会等一段时间并在返回给http客户端之前重试db连接)

  • https://unix.stackexchange.com/a/5279 (使用netcatnetstatlsof等待..睡眠,但我认为这些都需要sudo,除非您从ci框架中启动mysql,在这种情况下,来自ci框架的netstat应该提供信息)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接