【问题标题】:How to Add to MySQL Configuration on Travis CI When Not Sudo不使用 Sudo 时如何在 Travis CI 上添加 MySQL 配置
【发布时间】:2016-11-17 17:33:24
【问题描述】:

我试图弄清楚如何在 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 配置,而且我尝试过的每一次互联网搜索和方法都失败了。

【问题讨论】:

    标签: php mysql travis-ci


    【解决方案1】:

    innodb_buffer_pool_size 在 MySQL 5.7.5 之前不能动态更改。你用的是什么版本?

    在该版本之前,这里有一些选项:

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

    其他“变量”可以动态设置,也可以不动态设置。分别研究每一项。

    【讨论】:

      【解决方案2】:

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

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

      • 使用wgetbefore_script 中的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-bit)在这里: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 进程上的

      (从未测试过这个 - 不知道它是否有效 - 约束是'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 参数来测试哪些情况,而不是在测试实例数据库服务器中“永久”配置它们?

      • 假设您的mysqld 在容器启动时通过services: mysql 启动?你能配置travis启动mysqld具体在before_installscript,并在启动时指定你想要的参数,mysqld在ci框架下运行travis(i认为这应该允许它在不使用任何sudo 的情况下启动/停止/重新启动等,但我还没有测试过)请参阅:https://github.com/knyrb/mysql-travisci 以获得概念证明

      • (从未测试过这个,但它应该也可以工作)另一个选项可能是为您要执行的每个特定环境测试创建一个 github 项目,并将 mysqld 配置为使用已设置的限制参数运行:您的测试将是每个容器,而不是临时重启(可能很疯狂,取决于你想要它有多糟糕!)

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

      • 我纯粹是出于兴趣而问:在测试不同的环境和配置限制时,我的拙见总是倾向于“越多越好”的方法!


      (也从未测试过)不确定您是否使用了最新版本的 mysql 才能使此选项起作用,但我看到 mysql 8 restart 中有一条指令

      如果您可以让 mysql 存储过程触发从调用存储过程的特权帐户重新启动数据库服务,这可能对您有用 - 您将调用此存储过程然后等待服务器重新启动,例如以下方法:

      • sleep 的调用完成了证明中的工作(它不会导致失败 - 但如果任何进程返回 != 0,ci 构建将失败)

      • 1234563或在 python 中使用 inotify.adapters.InotifyTree().eventgen() (可能是矫枉过正!)
      • 尝试一个较长的超时连接,mysql -S/tmp/mysql.sock --connect-timeout=# --user=youruser --password

      • https://stackoverflow.com/a/21189440/4036945 (wait .. sleep 使用 curl 访问一个 web 服务,然后连接到数据库:也许您的应用程序有一个“状态”页面?也许它会等待一段时间并重试数据库在返回 http 客户端之前连接)

      • https://unix.stackexchange.com/a/5279wait .. sleep 使用netcatnetstatlsof,但我认为这些都需要sudo,除非你从ci 框架内启动mysql,其中@987654373来自 ci 框架的@应该提供信息)

      【讨论】:

        猜你喜欢
        • 2016-04-22
        • 2021-08-14
        • 1970-01-01
        • 2019-11-16
        • 1970-01-01
        • 2015-12-22
        • 2016-04-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多