1C 8.2用のPostgreSQLを手動で構築するか、簡単な方法は私たちにはありません!

この記事では、Gentoo Linuxで1C用のPostgreSQLデータベースを手動で構築する方法について説明します。

1C用のpostgresを構築するための迷路の行き止まりのブランチについては話をしません。 私は、インターネット上のどこにも利用できないものだけを説明します-私たちは科学的な突く方法を使って喫煙しました。 1C用のpostgresをインストールするためのマニュアルは豊富にありますが、いずれもメインのすくいを解決できず、すべて表面的なものであり、何も説明しませんでした。 したがって、このギャップを埋めることが私たちの義務であると考えました:-)





まず、Gentooを使用しますが、RPMパッケージはインストールしません。 Gentooのrpm形式で1Cパッケージをインストールすることはできなかったため(理由を説明するのに時間がかかりました)、src.rpmをダウンロードし、rpmbuildを使用して自動的にビルドすることはできなくなりました。 残っていたのは、rpm2tgzをrpm形式から単純なtar.gzアーカイブに転送して解凍することだけでした。 以下はステップバイステップのガイドです。



0.環境の準備:mkdir / tmp / t5 && cd / tmp / t5(最初から5つの開始がありました:-)



1.公式サイトからすべての必要なファイルを含むパッケージをダウンロードします:wget v8.1c.ru/overview/postgresql_patches/8-4-1/postgresql-8.4.1-1.1C.src.rpm



2.以下を実行します:rpm2tar postgresql-8.4.1-1.1C.src.rpm && rm postgresql-8.4.1-1.1C.src.rpm



3.アーカイブを解凍します:tar xf postgresql-8.4.1-1.1C.src.tar。 すべてのファイルは現在のディレクトリに展開されるため、クリーンフォルダーで実行することをお勧めします。 また、すぐにpostgresql-8.4.1.tar.bz2を解凍し、次のフォルダーに移動します。

tar xfj postgresql-8.4.1.tar.bz2 && cd cd postgresql-8.4.1



4.ファイル../postgresql-8.4.1C.specを開き、非常に長い間調べます:-)これは、rpmbuildが実行するすべてのことを記述しています(すべてが非常に単純な場合!)。 パッチが適用されるセクションを見つけ、同じ順序でこれを開始します(postgresがあるフォルダーから):



patch -p1 <../ rpm-pgsql.patch

patch -p1 <../ postgresql-logging.patch

patch -p1 <../ postgresql-perl-rpath.patch

patch -p1 <../ postgresql-prefer-ncurses.patch

patch -p0 <../ 1c_FULL_84-0.19.2.patch(p1ではなくp0!)

patch -p1 <../ postgresql-1c-8.3.patch-ジョークを送信します。パッチは重複しません! そして、これは公式配信です。 このようなパッチが重複するように、rpmの仕様を変更するものは見つかりませんでした。 幸いなことに、このパッチは小さく理解しやすいもので、デフォルトの設定オプションを変更するだけなので、インストール後に戻って設定をハンドルで修正します。 それまでの間、私たちはそれにスコアをつけて先に進みました。

patch -p0 <../ applock-1c-8.4.0.patch



5.次に、build rpm specセクションを調べ、configureが呼び出されるパラメーターを確認します。 1Cがperl、python、またはtclを使用することは信じられません(そして、データベースを1C専用に上げるため、他のデータベースを1C開発者データベースに残しません。通常の元のポストゲームに住んでいても)。 使用した合計:

./configure --disable-rpath --enable-nls --disable-integer-datetimes --enable-thread-safety



6. &&をインストールします。 postgresルートは/ usr / local / pgsqlにコピーされます。



次に、contribフォルダから追加のライブラリをインストールする必要があります。 1つのパッチが重複していなかったことを覚えていますか? contrib / Makefile 3に1Cからの追加のライブラリ(mchar、fulleq、fasttrun)が追加されます。 mcharをビルドするには、オプションのICUコンポーネントバージョン3.8が必要です。 したがって、我々は小さな余談をして、それを置きます:



mkdir / tmp / icu && cd / tmp / icu && wget download.icu-project.org/files/icu4c/3.8.1/icu4c-3_8_1-src.tgz

tar zxf icu4c-3_8_1-src.tgz && cd icu /ソース

./configure --prefix = / usr / local / icu && make && make install



ICUは、/ usr / local / icuに関連して配信されます。 ただし、実行時に接続されるライブラリのみが必要なので、postgresをインストールした後、このフォルダーを強制終了します。



contribビルドに戻りましょう。

cd /tmp/t5/postgresql-8.4.1/



7. contrib / mchar / Makefileファイルを編集し、PG_CPPFLAGSをICUパスに修正する必要があります。

PG_CPPFLAGS = -I / usr / local / icu / include。

また、同じファイルの一番下にあるSHLIB_LINKのパスを修正します。

SHLIB_LINK + = -L / usr / local / icu / lib -licuuc -l $(ICUNAME)-Wl、-rpath、 '$$ ORIGIN'



8.次に、contrib / MakefileファイルのWANTED_DIRSに3つの1Cコンポーネントを追加します(38行、 v8.1c.ru / overview / postgresql_patches / 8-4-1 / postgresql-1c-8.4.patchを参照)。

vacuumlo \

mchar \

fulleq \

ファストトラン



9. contribをビルドしましょう:

make -C contrib && make -C contrib install



10.ペンを使用して、次の行を使用して、必要なICUライブラリをフォルダーにコピーします。

cp -a / usr / local / icu / lib / * / usr / local / pgsql / lib /

rm -rf / usr / local / icu



11. / usr / local / pgsqlにコンパイルおよびインストールされたPostgres。 構成はまだ編集されません。 ベースが機能するシステムアカウントを作成します。



useradd -d / usr / local / pgsql / -s / bin / bash pgmaster

mkdir / usr / local / pgsql / data

chown pgmaster / usr / local / pgsql / data && chmod 700 / usr / local / pgsql / data

cat >> /usr/local/pgsql/.bash_profile << EOF

エクスポートLANG = ru_RU.UTF-8

PGPORTのエクスポート= 5434

export PATH = / usr / local / pgsql / bin:/ usr / local / pgsql / sbin:$ PATH

export LD_LIBRARY_PATH = / usr / local / pgsql / lib

Eof



サーバー上で1つのサーバーが既に実行されているため、1Cでは別のポートとシステムアカウントを選択し、su-pgmasterで実行されるbashプロファイルを作成したため、すべてのパスと変数が設定されます。



12.データベースを初期化して実行します。



mkdir / usr / local / pgsql / log && chown pgmaster / usr / local / pgsql / log

su-pgmaster

initdb -D / usr / local / pgsql / data

postgres -h 0.0.0.0 -p 5434 -D / usr / local / pgsql / data



サーバーは、制御端末を失うことなく静かに起動しました。

スーパープレーヤー(スクリーンドライブ、hehe)のパスワードを変更します。



su-pgmaster

psql template1

psql(8.4.1)

ヘルプを表示するには「help」と入力します。

template1 =#パスワード「pass-pass」でユーザーpgmasterを変更します。

ALTER ROLE

template1 =#

CTRL + D



次に、CTRL + Cを使用して最初のコンソールでpostgresを出力し、構成を編集します。



13.ファイルdata / pg_hba.conf。その中に信頼をmd5に変更し、ネットワークへのアクセスを許可するエントリを追加する必要があります。



ローカルすべてすべてmd5

すべての127.0.0.1/32 md5をすべてホスト

すべて0.0.0.0/0 md5をすべてホスト



14.ファイルデータ/ postgresql.conf、次のオプションをインストールする必要があります(未適用パッチの一部、デバッグ用の一部):



log_destination = 'stderr'

logging_collector = off#data / pg_logへのログイン中はオフにし、コンソールに出力します)

log_statement = 'all'#1Cがデータベースに返されることを確認したい!

listen_addresses = '*'#リッスンするインターフェイス

effective_cache_size = 512MB#1Cの推奨事項

max_locks_per_transaction = 150#1Cの推奨事項



15.共有メモリ。 sysctl -w kernel.shmmax = 256000000、または/etc/sysctl.confを編集し、そこにkernel.shmmax = 256000000を追加してから、sysctl -pを実行します。



16.そして今、楽しみが始まります。 postgresを再び開始します(postgres -D data -p 5434)。 1Cのベースを接続して作成します。



$ psql template1

パスワード:

psql(8.4.1)

ヘルプを表示するには「help」と入力します。

template1 =#



17.次に、template1データベースにplpgsql言語を作成する必要があります。



template1 =#言語plpgsqlを作成します;

言語を作成する

template1 =#



18.次に、1Cの3つのコンポーネントからのSQLコードを入力する必要があります。 この操作に関するインターネット上のどこにも言われていません。 RPM仕様全体を調査し、メイクチェック、テストなどを実行しました。 しかし、彼らはこのコードがRPMパッケージのtemplate1にどのように組み込まれるかを見つけませんでした。 したがって、これを手で行います。



template1 =#\ i /tmp/t5/postgresql-8.4.1/contrib/mchar/mchar.sql

template1 =#\ i /tmp/t5/postgresql-8.4.1/contrib/fulleq/fulleq.sql

template1 =#\ i /tmp/t5/postgresql-8.4.1/contrib/fasttrun/fasttrun.sql



突然mchar.soでロードを誓ったが、libicu *が見つからなかった場合、LD_LIBRARY_PATHを忘れたか、ICUを/ usr / local / pgsql / libにコピーして、最初に読んでください:-P



19.しかし、それだけではありません!!! 主な交通渋滞は、彼らが先に進むことができなかったためです。 ベース1Cに設定し、ログを調べます。



LOG:ステートメント:proname in( 'plpgsql_call_handler'、 'datediff'、 'mchar_in'、 'mc_mv_icase_cmp'、 'fasttruncate')でpg_procから1を選択します



その後、1Cは「データベースが不良で、適合しません」と言います。

コンソールからこのリクエストを入力します。



template1 =#pg_procからproname in( 'plpgsql_call_handler'、 'datediff'、 'mchar_in'、 'mc_mv_icase_cmp'、 'fasttruncate')から1を選択します;

?列?

-1

1

1

1

(4行)



4つですが、5つあるはずです! 除去することにより、datediffが欠落していることがわかります。 postgresqlを含むフォルダーおよび1Cパッチでそれを見つけようとしても、成功につながりません。



スノーフレークローカル#cd / tmp / t5 /

スノーフレークt5#ls

1c_FULL_84-0.19.2.patch pg_config.h postgresql-8.4.1C.spec postgresql.pam

applock-1c-8.4.0.patch postgresql-1c-8.3.patch postgresql-8.4.1.tar.bz2 postgresql-perl-rpath.patch

ecpg_config.h postgresql-8.4.1 postgresql-bashprofile postgresql-prefer-ncurses.patch

filter-requires-perl-Pg.sh postgresql-8.4.1-1.1C.src.tar postgresql.init README.rpm-dist

Makefile.regress postgresql-8.4.1-A4.pdf postgresql-logging.patch rpm-pgsql.patch

スノーフレークt5#fgrep -ri datediff *

スノーフレークt5#



インターネットでdatediff関数を見つけました。 なぜこれが必要なのか、そして一般にこれらのパッチがすべて必要なのはなぜか推測しました。 開発者は、1Cをpostgresに適合させる代わりに、postgresを適合させてSQLをMSSQLのように見せることに決めました! そこで彼らはそこに関数と型をプッシュしました! とにかく、datediffを見つけました。



念のため、彼女のコードは次のとおりです。

関数CREATEまたはREPLACE datediff(可変文字、タイムゾーンなしのタイムスタンプ、タイムゾーンなしのタイムスタンプ)

整数ASを返します

$ BODY $

デカール

$ 1のarg_modeエイリアス。

$ 2のarg_d2エイリアス。

$ 3のarg_d1エイリアス。

開始

arg_mode = 'SECOND'の場合

return date_part( 'epoch'、arg_d1)-date_part( 'epoch'、arg_d2);

elsif arg_mode = 'MINUTE' then

return ceil((date_part( 'epoch'、arg_d1)-date_part( 'epoch'、arg_d2))/ 60);

elsif arg_mode = 'HOUR' then

return ceil((date_part( 'epoch'、arg_d1)-date_part( 'epoch'、arg_d2))/ 3600);

elsif arg_mode = 'DAY' then

return cast(arg_d1 as date)-cast(arg_d2 as date);

elsif arg_mode = 'WEEK' then

return ceil((cast(arg_d1 as date)-cast(arg_d2 as date))/ 7.0);

elsif arg_mode = 'MONTH' then

return 12 *(date_part( 'year'、arg_d1)-date_part( 'year'、arg_d2))

+ date_part( 'month'、arg_d1)-date_part( 'month'、arg_d2);

elsif arg_mode = 'QUARTER' then

return 4 *(date_part( 'year'、arg_d1)-date_part( 'year'、arg_d2))

+ date_part( 'quarter'、arg_d1)-date_part( 'quarter'、arg_d2);

elsif arg_mode = 'YEAR' then

return(date_part( 'year'、arg_d1)-date_part( 'year'、arg_d2));

終了する場合;

終了

$ BODY $

言語plpgsql揮発性

費用100;



注意! Habriceのテキストをフォーマットすると、マイナス記号がハイフンに置き換えられます。 最初に手順のテキストをテキストエディターにコピーし、長いハイフンを短いマイナス記号で一括置換します。そうしないと、postgresは誓います:-)



もう一度数えてください:-)



template1 =#pg_procからproname in( 'plpgsql_call_handler'、 'datediff'、 'mchar_in'、 'mc_mv_icase_cmp'、 'fasttruncate')から1を選択します;

?列?

-1

1

1

1

1

(5行)



乾杯! しかし、それはありました:-) 10回関数を数え直しましたが、そのうちの5つがあります。 そして、5つあります! そして、起動時の1Cはまだベースが悪いと言っており、それ以上先へ進むことはありません。 1Cを構成するときの最初のリクエストを、すべて(数個!)もう一度調べます。 私たちは、彼女ができることは、それらを数えることだと理解しています! しかし、5つあります!!!

1Cサイトからアーカイブをダウンロードしてから3時間でこの結果を達成しました。 それからタンバリンでダンスを始めました。 多数の再構築、異なるバージョンのダウンロード試行、Etersoftからの配布...しかし、出力は同じです:5つの機能、5つのユニット。 壁に向かっていますが。

そして、作業構成でこの手順を実行するというアイデアが浮かび上がりました...テキストを友人にメールで送信し、友人がデータベースにフィードして、結果を送信します。



demo =#pg_procからproname in( 'plpgsql_call_handler'、 'datediff'、 'mchar_in'、 'mc_mv_icase_cmp'、 'fasttruncate')から1を選択します;

?列?

-1

1

1

1

1

1

(6行)



静かなquiet迷があります。 思考は困難を伴います。 明らかに複数の手順があることに気づいた人がいます:-))

論理的です。 mailメソッドを使用すると、plpgsql_call_handlerが2つのインスタンスにあることがわかります。 デモマシンでproname = 'plpgsql_call_handler'のpg_procからselect *を呼び出すと、pronamespaceフィールドを除き、2つの同一のレコードが生成されました。

手でレコードをpg_procシステムテーブルに貼り付けようとする長い試みで、与えられた値を誓います。

再びst迷。 理由は明確です-いいえ。

次に、Yandexにplpgsql_call_handlerという単語を1つ入力します(その前に、さまざまな組み合わせがGoogleに試行されました)。 そもそもサイトはwww.samag.ru/art/10.2004/2004_07.htmlです。



次に、作成したデータベースで手続き型言語PL / pgSQLが利用できることを確認する必要があります。 これを行うには、次のコマンドを実行します。



select * from pg_language;

結果にplpgsqlがない場合、OSのコマンドシェルから次のコマンドを実行します。



$ createlang –U pgsql plpgsql eshop

-Uオプションは、この操作を実行するデータベース管理者ユーザーを指定します。



次の2つのコマンドを実行することにより、クライアントプログラム(psqlなど)から言語サポートを有効にすることもできます。



関数plpgsql_call_handler()を作成します

language_handlerを返します

「$ libdir / plpgsql」、「plpgsql_call_handler」として

言語 'c';

信頼できる手続き言語「plpgsql」を作成する

ハンドラーplpgsql_call_handler;

1つ目はライブラリ関数に基づいてハンドラー関数を作成し、2つ目は上記で作成されたハンドラーに基づいてPL / pgSQL言語自体を作成します。





そして、それが始まりました-同じ手順をもう一度作成するために:-P

データベースにプロシージャを注ぎます:

関数plpgsql_call_handler()を作成します

language_handlerを返します

「$ libdir / plpgsql」、「plpgsql_call_handler」として

言語 'c';



template1 =#関数plpgsql_call_handler()を作成します

template1-#language_handlerを返します

template1-# '$ libdir / plpgsql'、 'plpgsql_call_handler'

template1-#言語 'c';

関数を作成する

template1 =#select * from pg_proc where proname = 'plpgsql_call_handler';

プロネーム| プロネームスペース| 所有者| プロラン| 費用| プロロウズ| プロヴァン proisagg | proiswindow | prosecdef | proisstrict | プロレットセット| 揮発性| プロナーグ| pronargdefaults | prorettype | proargtypes | proallargtypes | proargmodes | proargnames | proargdefaults | prosrc | プロビン| proconfig | proacl

---------------------- + -------------- + ---------- +- -------- + --------- + --------- + ------------- + ------- --- + ------------- + ----------- + ------------- + ------ ----- + ------------- + ---------- + ----------------- +- ----------- + ------------- + ---------------- + ------- ------ + ------------- + ---------------- + ------------ ---------- + ----------------- + ----------- + --------

plpgsql_call_handler | 11 | 10 | 13 | 1 | 0 | 0 | f | f | f | f | f | v | 0 | 0 | 2280 | | | | | | plpgsql_call_handler | $ libdir / plpgsql | |

plpgsql_call_handler | 2200 | 10 | 13 | 1 | 0 | 0 | f | f | f | f | f | v | 0 | 0 | 2280 | | | | | | plpgsql_call_handler | $ libdir / plpgsql | |

(2行)



ここにあります:-)

チェック:



template1 =#pg_procからproname in( 'plpgsql_call_handler'、 'datediff'、 'mchar_in'、 'mc_mv_icase_cmp'、 'fasttruncate')から1を選択します;

?列?

-1

1

1

1

1

1

(6行)



最終-template1からベースを作成します:



template1 =#データベースエンタープライズを作成します。

データベース作成



そして今、私たちは1Cを開始し、エンタープライズに設定します...ああ、奇跡! データベースが作成され、1Cが構造全体にフラッディングしました。



そして今、質問。 1Cプログラマーがデータベースに2つの同じ手順を持っているのはなぜですか?

:-)))



PS次に、再生時にdatediffを削除し、plpgsql_call_handlerに依存していることがわかりました。

template1 =#言語plpgsqlをドロップします;

エラー:他のオブジェクトが依存しているため、言語plpgsqlを削除できません

詳細:関数datediff(文字可変、タイムゾーンなしのタイムスタンプ、タイムゾーンなしのタイムスタンプ)は言語plpgsqlに依存

しかし、すべて同じように、彼らはEmersoftまたは1Cのアセンブルされたディストリビューションのどこから来たのか理解していませんでした:-))



All Articles