راه‌اندازی کلاینت Perl به همراه mariadba 10.1 در Debian 9

به نظر می‌رسه نصب client mysql/mariadb برای perl (DBD::mysql) در نسخه ۹ یا stretch دبیان (شاید نسخه‌های دیگه و توزیع‌های دیگه هم) مشکل دارد. نصب بسته libdbd-mysql-perl با استفاده از apt کار نمی‌کنه و وقتی ماژول mysql می‌خواد لود بشه پیام می‌ده که نمی‌تونه mariadbclient.so.18 را نمی‌تونه پیدا کنه.

برای بررسی بیشتر:

perl -I./ DefinePatch.pl
Can't load '/usr/lib/x86_64-linux-gnu/perl5/5.24/auto/DBD/mysql/mysql.so' for module DBD::mysql: libmariadbclient.so.18: cannot open shared object file: No such file or directo
ry at /usr/lib/x86_64-linux-gnu/perl/5.24/DynaLoader.pm line 187. 
 at DefinePatch.pm line 3. 
Compilation failed in require at DefinePatch.pm line 3. 
BEGIN failed--compilation aborted at DefinePatch.pm line 3. 
Compilation failed in require at ./DefinePatch.pl line 4. 
BEGIN failed--compilation aborted at ./DefinePatch.pl line 4.

نصب هیچ پکیجی قرار نیست این مشکل را حل کنه. راهکار اینه که کلاینت mysql پرل را از سورس نصب کنید. برای نصبش اول فایلش را دانلود کنید: http://search.cpan.org/~michielb/DBD-mysql-4.042/lib/DBD/mysql.pm

در ضمن مطمئن بشید بسته libmariadbclient-dev (برای استفاده از mysql_config) و build-essential (برای استفاده از make) روی سیستم نصبه. فایل فشرده را باز کنید و برید داخلش.

بعد دستورات زیر را اجرا کنید:

perl Makefile.PL
make
make test

sudo make install

 

مشکل حل شده است! و می‌تونید از mariadb توی perl استفاده کنید.

کد تست:

#!/usr/bin/perl
use DBI;
use DBD::mysql;

 

نکته: در صورتی که کاربر فعلی دسترسی به دیتابیس test در mariadb نداره، می‌تونید با پارامترهای در دستور زیر perl Makefile.PL یه دیتابیس و یوزر پسورد برای تست کردن در زمان build یا تست مشخص کنید:

  • testdb نام دیتابیس تست
  • testuser نام کاربر برای اتصال به mariadb
  • testpassowrd رمز کاربر برای اتصال به mariadb
  • پارامترهای testhost و testport هم برای مشخص کردن سرور mariadba

نکته: در جدیدترین بروزرسانی perl در دبیان در فایل

/etc/perl/sitecustomize.pl

یه تنظیم اضافه شده است که امکان import کردن module از فولدر فعلی وجود نداشته باشد. برای رفع مشکل اسکریپ‌های مشکل‌دار می‌شه این تنظیم را غیرفعال کرد. توجه داشته باشید این تغییر به دلایل امنیتی انجام شده است پس تا مجبور نشدین تغییر ندین:

# This script is only provided as a transition mechanism for
# removing the current working directory from the library search path
# while leaving a temporary way to override this locally.
#
# If you really need "." to be on @INC globally, you can comment
# this away for now. However, please note that this facility
# is expected to be removed after the Debian stretch release,
# at which point any code in this file will not have any effect.
#
# Please see CVE-2016-1238 for background information on the risks
# of having "." on @INC.

#pop @INC if $INC[-1] eq '.' and !$ENV{PERL_USE_UNSAFE_INC};

استفاده از پارامتر I جلوی perl در خط فرمان هم می‌تونه این مشکل را موقت حل کنه.