在Heroku上设置PostgreSQL APPLICATION_NAME(Setting Post

2019-10-17 22:13发布

application_name是PostgreSQL特定连接参数,其中每个客户端可以(也应该)连接时设定。 后来在帮助DBA和操作人员用的应用程序代码的特定位关联行为不端的查询。

这太问题解释了如何设置application_name使用SQLAlchemy的 ,但不幸的是,它并没有在Heroku上工作,因为设置application_name是在PostgreSQL的增加8.5分支(这是唯一的释放9.0 ),而版本的PostgreSQL客户端库( libpq )安装在Heroku的DYNOS从PostgreSQL的8.4.9建立。

什么,如果有的话,可以做,以设置application_name在Heroku?

Answer 1:

据我所知, 唯一的解决办法是厂商的一个新版本libpq到您的蛞蝓。

我针对这些软件包libpq5和的libpq-dev的 ,从源码包构建的PostgreSQL-9.1 。 为了节省自己大量的工作 ,如果你相信我的二进制文件,你可以跳到步骤8,并使用我所做的预构建的二进制的libpq。 不,不,不用谢我。

  1. 旋转了一个新的VM香草12.04
  2. sudo apt-get update
  3. apt-get source postgresql-9.1 (你可能会需要sudo apt-get install dpkg-src第一)
  4. 在提取来源,看看规则文件( postgresql-9.1-9.1.8/debian/rules ,如果precise-updates仍处于PostgreSQL的9.1.8)。
  5. 从规则文件,我认为,我们应该建立我们的libpq使用的配置选项包括:

     LDFLAGS="-Wl,--as-needed -Wl,-z,now" \ CFLAGS="-fPIC -DLINUX_OOM_ADJ=0" \ ./configure --prefix=/app/vendor \ --enable-integer-datetimes \ --enable-thread-safety \ --enable-debug \ --disable-rpath \ --with-gnu-ld \ --with-pgport=5432 \ --with-system-tzdata=/usr/share/zoneinfo \ --without-tcl \ --without-perl \ --without-python \ --with-krb5 \ --with-gssapi \ --with-openssl \ --with-libxml \ --with-libxslt \ --with-ldap 

    请注意,我删除/否定--enable-nls --with-ossp-uuid --with-tcl --with-perl --without-python --with-pam ,因为Heroku的赛道它们会导致配置/编译失败。 我不需要任何人,我不知道他们是否会影响libpq5可言,我怀疑他们是非常需要在测功机,如果你觉得不然,有乐趣固定这一点,我的帽子的关闭对你的好先生。

  6. make && make install

  7. 现在,所有的PostgreSQL安装到/vendor 。 我们需要采取的文件中指定postgresql-9.1-9.1.8/debian/libpq5.installpostgresql-9.1-9.1.8/debian/libpq-dev.install 。 唉,因为我们没有关注Debian的安装布局,我们需要适应这些列表找到我们真正需要的文件。 我想出了这个名单:

     tar c \ include/postgresql/internal/* \ include/libpq-fe.h \ include/libpq-events.h \ include/libpq/libpq-fs.h \ include/pg_config*.h \ include/postgres_ext.h \ include/postgresql/9.1/server/catalog/pg_type.h \ include/postgresql/9.1/server/catalog/genbki.h \ include/postgresql/9.1/server/nodes/nodes.h \ include/postgresql/9.1/server/utils/elog.h \ include/postgresql/9.1/server/utils/errcodes.h \ include/postgresql/9.1/server/utils/palloc.h \ include/postgresql/9.1/server/ch \ include/postgresql/9.1/server/pg_config.h \ include/postgresql/9.1/server/pg_config_manual.h \ include/postgresql/9.1/server/pg_config_os.h \ include/postgresql/9.1/server/port.h \ include/postgresql/9.1/server/pg_trace.h \ include/postgresql/9.1/server/postgres.h \ include/postgresql/9.1/server/postgres_fe.h \ include/postgresql/9.1/server/postgres_ext.h \ include/postgresql/9.1/server/mb/pg_wchar.h \ lib/libpq.so \ bin/pg_config \ lib/libpq.so.5* \ | gzip --best > /tmp/libpq-5.4_9.1.8.tar.gz 

    请注意,我不得不删除手册页( pg_config.1.gz )和本地化消息( LC_MESSAGES/pg_config-9.1.mo LC_MESSAGES/libpq*.moshare/locale ),其中,出于某种原因,并没有建立在我的赛道。 我设法联系Python的psycopg2针对此文件列表,并成功地使用它,但你可以算出来,并修复它,以及如果你觉得这是非常重要的。

  8. 我们的麻烦实际上是结束了。 你应该承担由此产生libpq-5.4_9.1.8.tar.gz文件,并把它的地方,这将是通俗易懂你的测功机的buildpack(如S3),然后将其供应商到蛞蝓。 如果你不知道该怎么做,我的建议(当前的Python buildpack ),是你创建你塞文件“斌/ pre_compile”,并把这个到它:

     #!/bin/sh vendor() { printf " " echo -n "$1 " curl --location --fail --silent $1 | tar -zx -C vendor && echo OK } echo " (lines by the app will be prefixed with ---->>)" echo "---->> Fetching vendored binaries" mkdir -p vendor vendor "http://fusic.s3.amazonaws.com/executables/heroku/libpq-5.4_9.1.8.tar.gz" echo "---->> Injecting shell environment" # Even though Heroku's Python buildback has a hook mechanism, hooks can't # change the buildpack's process environment (they are spawned, not # sourced). This makes it possible to write hooks in any language, but # makes vendoring stuff that should be linked against libraries installed # during the rest of the build process harder. The kludge below hijacks # $BIN_DIR/steps/pylibmc, which is sourced after this code and before pip # is ran. Puked a little in my mouth. # See also: https://twitter.com/aknin/status/290832546260979712 cat > $BIN_DIR/steps/pylibmc << EOF echo "---->> Injected environment hook executing" source .profile.d/activate_vendor_tree.sh EOF 

    并创建.profile.d/activate_vendor_tree.sh ,并把这个到它:

     #!sh export PATH="/app/vendor/bin:$PATH" export CFLAGS="-I/app/vendor/include" export LDFLAGS="-L/app/vendor/lib -R/app/vendor/lib" export LD_LIBRARY_PATH="/app/vendor/lib:$LD_LIBRARY_PATH" 

    当编译您的蛞蝓,我们在安装踢预挂钩,下载我们的回迁的libpq和IT厂商到塞。 如果你正在使用Python buildpack或类似的限制buildpack(见上面详细的评论),在丑陋的,但必要的环境射出勾踢,你的要求,将针对新的libpq编译。 当你运行你的应用程序,方便的Heroku源一切.profile.d执行你的代码,再次激活新的libpq之前。 哦耶。

  9. 终于,大功告成。 部署应用程序的Heroku来,和你的依赖应该针对新的libpq链接​​。 如果您的应用程序已完成部署,您可能需要清除蛞蝓的缓存目录之前Heroku的蛞蝓编译器将尝试重新安装这些要求(这样它们可以连接到您的新的libpq,这是一个棘手的话题,这是范围之外本教程的,我知道的唯一方法是要坚持的东西在pre_compile将删除缓存)。 啊。



文章来源: Setting PostgreSQL application_name on Heroku