如何在不使用 Sudo 时在 Travis CI 上添加到 MySQL 配置

2022-08-30 23:43:13

我试图弄清楚如何在Travis CI测试运行之前更改MySQL配置。我们正在使用“sudo:false”指令,我认为使用容器...我不是最好的开发运营人员。

但是,即使我将 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配置,并且我尝试过的每个互联网搜索和方法都让我失败了。


答案 1

innodb_buffer_pool_size在MySQL 5.7.5之前无法动态更改。您使用的是哪个版本?

在该版本之前,以下是一些选项:

  • 修改(或它位于任何位置)/etc/my.cnf
  • 假设 my.cnf 在末尾有一个“include”,然后暂时将一个文件添加到提到的目录中。它需要 2 行和 ;然后重新启动 mysqld。[mysqld]innodb_buffer_pool_size=512M
  • 添加到 的启动中。--innodb_buffer_pool_size=512Mmysqld

其他“变量”可能是可动态设置的,也可能不是动态可设置的。分别研究每一个。


答案 2

我提出了一个.travis.yml配置,允许您在不使用的情况下运行和重新启动 - 逻辑如下:mysqldsudo

  • 只是出于兴趣,为什么不能使用?sudo

  • https://dev.mysql.com/downloads/mysql/ 获取通用的linux.tar.gz - 将.tar.gz存储在将要缓存的目录中 - 如果文件已经存在,请不要这样做before_scriptwget

  • 解压缩.tar.gz到缓存的目录 - 如果解压缩目标已存在,请不要这样做

  • 清理错误日志并重新创建 .cnf 文件

  • 现在在 中,第一次启动,等待一会儿,检查它是否正在运行,然后停止它scriptmysqld

  • 对所需的配置进行任何更改

  • 第二次启动,稍等片刻,检查配置更改,然后停止mysqld

  • 证明(mysql 5.6.40通用linux 64位)在这里:https://github.com/knyrb/mysql-travisci/blob/master/.travis.yml - 这是一个(非工作)内容的粗略想法:.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中的“动态:否”任何内容 - 我重申了明显的fwiw:php参数是通过php动态施加在php进程上的.ini


(从未测试过这个 - 不知道它是否有效 - 约束是“no sudo”,这种方法显然需要)首先,你有没有试过使用二进制(https://linux.die.net/man/8/service)而不是直接调用?即 https://docs.travis-ci.com/user/database-setup/#MySQL-5.7sudoservicemysql

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通过服务在容器启动时启动:mysql?你能将travis配置为专门在启动时启动,或者指定你在启动时想要的参数,在ci框架下运行(我认为这应该允许它启动/停止/重新启动等,没有任何sudo使用,但我还没有测试它)请参阅: 念验证的 https://github.com/knyrb/mysql-traviscimysqldbefore_installscriptmysqldtravis)

  • (从未测试过这个,但它也应该工作)另一种选择可能是为要执行的每个特定环境测试提供一个github项目,mysqld配置为在已经设置的限制参数的情况下运行:您的测试将是每个容器,而不是临时重新启动(可能是疯狂的,取决于您想要的有多糟糕!

  • (如果您的测试与性能相关,请记住在开始测量之前给db a / 一些预热查询)

  • 我纯粹出于兴趣而问:当涉及到测试不同的环境和配置限制时,我的拙见总是赞成“越多越多”的方法!


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

如果您可以让mysql存储的proc触发数据库服务的重新启动,则这可能对您有用,该帐户调用存储的proc - 您可以调用此存储的proc,然后等待服务器重新启动,例如使用以下方法之一:

  • 调用以完成证明中的作业(它不会解释失败 - 但是如果任何进程返回!= 0,则 ci 构建将失败)sleep

  • 如果您使用本地unix /域套接字,请使用此处的任何方法等待文件(或您的等效项):https://superuser.com/questions/878640/unix-script-wait-until-a-file-exists,来自inotify工具;或者从python内部使用(可能过度了!/tmp/mysql.sockwhile .. sleepinotifywaitinotify.adapters.InotifyTree().eventgen()

  • 尝试长时间超时连接,mysql -S/tmp/mysql.sock --connect-timeout=# --user=youruser --password

  • https://stackoverflow.com/a/21189440/4036945(用于点击一个依次连接到数据库的Web服务:也许你的应用程序有一个“状态”页面?也许它会等待一段时间,并在返回http客户端之前重试数据库连接)wait .. sleepcurl

  • https://unix.stackexchange.com/a/5279(使用,和,但我认为这些都是需要的,除非你从ci框架中启动mysql,其中ci框架应该提供信息)wait .. sleepnetcatnetstatlsofsudonetstat


推荐