أدوات المستخدم

أدوات الموقع


docs:dba_basic

اختلافات

عرض الاختلافات بين النسخة المختارة و النسخة الحالية من الصفحة.

رابط إلى هذه المقارنة

جانبي المراجعة السابقة المراجعة السابقة
المراجعة التالية
المراجعة السابقة
docs:dba_basic [2014/08/13 12:28]
alsadi [فلنبدأ بعمل مستخدم]
docs:dba_basic [2015/04/23 00:19] (حالي)
سطر 1: سطر 1:
 +{{tag>​مقالات مسودات بدهيات برمجة ويب خوادم قواعد_بيانات sql mysql mariadb postgresql}}
 +====== بدهيات إدارة قواعد البيانات ======
 +
 +
 +<note warning>
 +هذه الصفحة لا تزال قيد الإنشاء
 +</​note>​
 +
 +
 +<​note>​
 +قد تحب أن تراجع مقالتنا السابقة [[sql_basics]]
 +</​note>​
 +
 +===== قواعد بيانات SQLite =====
 +
 +
 +إنشاء قاعدة بيانات sqlite هو مجرد اتصال على ملف غير موجود في مجلد لك صلاحيات الكتابة فيه. أما إدارتها فهي أيضا بذات السهولة فهي ملفات تديرها كما تدير أي ملف على النظام من خلال صلاحيات الملف للمالك والمجموعة المالكة والبقية.
 +
 +===== قواعد بيانات MySQL =====
 +
 +==== الإعداد والاستهلال ====
 +
 +بعد تثبيت حزمة خادم mysql وقبل تشغيل الخادم لأول مرة يفضل أن تراجع ملف الإعدادات وهو /etc/my.cnf احتفظ بنسخة منه قبل أن تشرع بتعديله.
 +الإعدادات الإفتراضية لا تفعل الكثير من الكاش فهي تناسب خادوم له مواصفات متواضع وحجم ذاكرة رام محدود جدا.
 +ستجد إعدادات بديلة في مجلد ​ /​usr/​share/​doc/​mysql-server-X.Y.Z/​ مثل
 +
 +  * my-large.cnf
 +  * my-huge.cnf
 +  * my-innodb-heavy-4G.cnf
 +
 +القالب يحتوي العديد من التعليقات قد تحب أن تقرأه. ​
 +
 +بعد ذلك يمكنك تشغيله عليه الأمر
 +
 +<​code>​service mysqld start</​code>​
 +
 +أو
 +
 +<​code>​systemctl start  mysqld.service</​code>​
 +
 +
 +
 +إن كانت إعداداتك تفوق قدرة جهازك قم بمراجعة my.cnf والعودة لإعدادات أقل ثم جرب مجددا في أسوأ الأحواب قد تضطر أن تحذف مجلد /​var/​lib/​mysql/​ ثم تنفذ الأمر
 +
 +<​code>/​usr/​libexec/​mysqld-prepare-db-dir</​code>​
 +
 +
 +يمكنك تعيين كلمة السر الخاصة بإدارة خادم قواعد البيانات عبر الأمر وضعها غير كلمة سر المستخدم الجذر لنظام التشغيل
 +
 +<​code>​mysqladmin -u root password</​code>​
 +
 +والأفضل أن تنفذ الأمر mysql_secure_installation والذي يعمل على ما يلي:
 +
 +  * تعيين كلمة السر للمدير قاعدة البيانات root
 +  * إزالة كل المستخدمين الآخرين ذوي الصلاحيات المطلقة والذين يمكنهم الولوج عنبعد
 +  * إزالة صلاحيات المجاهيل
 +  * إزالة قاعدة البيانات test والتي يسمح بالولوج إليها لكل المستخدمين
 +
 +==== الاتصال بقاعدة البيانات ====
 +
 +اكتب الأمر التالي للاتصال للتصال بقاعدة البيانات عبر unix file socket وهو الملف /​var/​lib/​mysql/​mysql.sock ​ وليس عبر tcp/ip
 +
 +<​code>​mysql -u root</​code>​
 +
 +إن كنت قد حددت كلمة سر يمكنك إضافة الخيار p ثم كلمة السر دون مسافة أو تركها حتى يسألك عنها هكذا
 +
 +<​code>​mysql -u root -p</​code>​
 +
 +للاتصال عبر tcp/ip استعمل الخيار -h ثم العنوان هكذا
 +
 +<​code>​mysql -u root -p -h localhost</​code>​
 +
 +
 +إذا كنت تتصل لتنفيذ استعلام واحد يمكنك تمريره بالخيار e أو تمريره عبد المدخلات القياسية عبر أنبوب | من echo أو cat أو عبر تحديد المدخلات بعلامة أقل من.
 +
 +
 +==== إنشاء قاعدة بيانات جديدة ====
 +
 +<code sql>
 +CREATE DATABASE my_test_db;
 +CREATE DATABASE my_test_db DEFAULT CHARACTER SET = utf8;
 +</​code>​
 +
 +ولعرض قواعد البيانات الموجودة نكتب
 +
 +<code sql>
 +SHOW DATABASES;
 +</​code>​
 +
 +انظر ​
 +
 +  * http://​dev.mysql.com/​doc/​refman/​5.7/​en/​create-database.html
 +  * http://​dev.mysql.com/​doc/​refman/​5.7/​en/​show-databases.html
 +
 +==== إنشاء وعرض الجداول ====
 +
 +
 +مثال على إنشاء جدول
 +
 +<code sql>
 +CREATE TABLE users (
 +  id         ​INTEGER ​    NOT NULL PRIMARY KEY AUTO_INCREMENT,​
 +  name       ​VARCHAR(64) NOT NULL,
 +  phone      VARCHAR(64) NOT NULL
 +) ENGINE=InnoDB DEFAULT CHARSET=utf8;​
 +</​code>​
 +
 +ولعرض الجداول
 +
 +<code sql>SHOW TABLES;</​code>​
 +
 +==== إدارة صلاحيات الوصول ====
 +
 +لإنشاء مستخدم ادخل بصفة إدارية root ثم استعمل الأمر create user هكذا
 +
 +<code sql>
 +CREATE USER '​ahmad'​ IDENTIFIED BY '​password';​
 +</​code>​
 +
 +هنا عملنا مستخدم اسمه ahmad على أي عنوان IP (عدا ال localhost عبر unix socket) وهو يكافئ الأمر
 +
 +<code sql>
 +CREATE USER '​ahmad'​@'​%'​ IDENTIFIED BY '​password';​
 +</​code>​
 +
 +يمكنك اشتراط أو تحديد العنوان المستخدم في الدخول وهذا مفيد عندما تريد التراخي في كلمة السر عندما يكون الاتصال محليا (من يملك وصول لكامل الخادم فإنه إما موثوق أو تأخر الأمر فالغريق لا يخشى البلل)
 +
 +<code sql>
 +CREATE USER '​localuser'​@'​localhost'​ IDENTIFIED BY '​password';​
 +</​code>​
 +
 +<​note>​
 +عندما نقول من كل عنوان ''​%''​ فإن هذا لا يشمل unix socket وهو localhost.
 +</​note>​
 +
 +يمكن منح الصلاحيات للمستخدم عبر GRANT وأشهر مثال هو GRANT ALL و GRANT SELECT وتعنيان اسمح له بكل شيء والثانية باستعلامات القراءة فقط.
 +
 +<code sql>
 +GRANT ALL ON my_test_db.* TO '​ahmad';​
 +GRANT SELECT ON *.* TO '​ali'​@'​localhost';​
 +</​code>​
 +
 +  * https://​www.digitalocean.com/​community/​tutorials/​how-to-create-a-new-user-and-grant-permissions-in-mysql
 +  * http://​dev.mysql.com/​doc/​refman/​5.1/​en/​create-user.html
 +  * http://​dev.mysql.com/​doc/​refman/​5.1/​en/​grant.html
 +
 +
 +==== النسخ الاحتياطي والاسترجاع ====
 +
 +  * mysqldump
 +
 +==== إدارة مساحة التخزين ====
 +
 +
 +إذا كنت قد فعلت binary logs ووجدت أنها تستهلك مساحة القرص يمكنك حذف البيانات قبل تاريخ معين عبر الأمر
 +
 +<code sql>​PURGE BINARY LOGS BEFORE '​2014-07-15';</​code>​
 +
 +والأفضل تحديد القيم المناسبة في ملف my.cnf
 +
 +<​code>​
 +expire_logs_days ​       = 10
 +max_binlog_size ​        = 100M
 +</​code>​
 +
 +
 +===== قواعد بيانات MariaDB =====
 +
 +  * كلمة عنها
 +  * كلمة عن محركات التخزين
 +
 +===== قواعد بيانات PostgreSQL =====
 +
 +==== تمهيد ====
 +
 +قواعد PostgreSQL هي الأقوى دون منازع في عالم البرمجيات مفتوحة المصدر وهي تتفوق على MySQL و MariaDB في العديد من الأمور.
 +
 +==== التثبيت ====
 +
 +في فيدورا (ومثيلاتها كريدهات وسنتوس) ثبت حزمة الوكيل client واسمها postgresql وحزمة الخادم وإضافاته هما postgresql-server و postgresql-contrib
 +
 +<code bash>yum install postgresql-server postgresql-contrib postgresql</​code>​
 +
 +في ديبيان (وأوبنتو ومنت) اسم حزمة الوكيل هو postgresql-client واسم حزمة الخادم وإضافاته هو postgresql و postgresql-contrib
 +
 +<code bash>​apt-get install postgresql postgresql-contrib postgresql-client</​code>​
 +
 +  * https://​fedoraproject.org/​wiki/​PostgreSQL
 +  * https://​help.ubuntu.com/​community/​PostgreSQL
 +
 +==== الاستهلال ====
 +
 +في فيدورا يوجد ملف يشرح لك ويساعدك موجود في المسار (مع تعديل الرقم ) قد تحب أن تتصفحه
 +
 +<code bash>
 +rpm -q postgresql
 +less /​usr/​share/​doc/​postgresql-9.2.5/​README.rpm-dist
 +</​code>​
 +
 +الطريقة باختصار هي أن تكتب الأمر بصلاحيات الجذر
 +
 +<code bash>
 +postgresql-setup initdb
 +</​code>​
 +
 +هذا الأمر يستهل مجلد يحتوي إعدادات خادم PostgreSQL وبياناته الأساسية. ​ هذا المجلد هو /​var/​lib/​pgsql/​
 +
 +<code bash>
 +cd /​var/​lib/​pgsql/​
 +ls
 +ls data
 +less data/​postgresql.conf
 +</​code>​
 +
 +قد يختلف المسار من توزيع إلى أخرى وقد يعمل له روابط في أكثر من مكان. مسار ملف الإعدادات في أوبنتو هو داخل /​etc/​postgresql/​current/​main/​.
 +
 +داخل ملف postgresql.conf ستجد الكثير من التعليقات الإرشادية. أهم الخيارات التي قد تحتاج تغييرها
 +
 +  * listen_addresses
 +  * max_connections
 +
 +يمكنك تركها كما هي الآن.
 +
 +لتشغيل الخادم في الأنظمة التي تعتمد systemd نستعمل systemctl هكذا
 +
 +<code bash>​systemctl start postgresql</​code>​
 +
 +وليعمل تلقائيا عند إعادة تشغيل الجهاز نكتب
 +<code bash>​systemctl enable postgresql</​code>​
 +
 +ويمكنك استعمال service أو /etc/init.d كالمعتاد في التوزيعات الأخرى. مثلا لتشغيله في أوبنتو اكتب
 +
 +<code bash>/​etc/​init.d/​postgresql start</​code>​
 +
 +من ملفات الإعدادات الأخرى التي نتجت من عملية الاستهلال وهما يتعلقان بطريقة الوثوق بالمستخدمين
 +
 +  * pg_hba.conf
 +  * pg_ident.conf
 +
 +==== استعمال الوكيل ====
 +اسم وكيل خادم postgresql هو psql. وهناك مستخدم على نظام التشغيل يثق به الخادم عند الاتصال عبر ملف المقبس unix file socket وليس عبر TCP/IP اسم هذا المستخدم (على الأقل في فيدورا وأوبنتو) هو postgres. لذا يمكنك تشغيل الوكيل بالأمر التالي
 +
 +<code bash>
 +su postgres -c psql
 +sudo -u postgres psql
 +</​code>​
 +
 +وسيظهل على شاشتك شيء يشبه هذا
 +
 +<​code>​
 +could not change directory to "/​root"​
 +psql (9.2.5)
 +Type "​help"​ for help.
 +
 +postgres=# help
 +You are using psql, the command-line interface to PostgreSQL.
 +Type:  \copyright for distribution terms
 +       \h for help with SQL commands
 +       \? for help with psql commands
 +       \g or terminate with semicolon to execute query
 +       \q to quit
 +</​code>​
 +
 +تبدأ أوامر psql بعلامة الشرطة المائلة الخلفية \ ثم حرف أو كلمة ومن أهمها
 +
 +  * ? عرض مساعدة عن أوامر PostgreSQL مثل هذه
 +  * h عرض مساعدة عن لغة SQL
 +  * l سرد كل قواعد البيانات (ويمكن أن تلحقها ب + لمزيد من التفاصيل)
 +  * d عرض كل الجداول والفهارس ...
 +     * dt عرض كل الجداول
 +     * ألحقها ب + لعرض المزيد من التفاصيل كذلك أتبعها باسم الجدول لتحديده
 +  * c أو connect للاتصال بقاعدة بيانات جديدة وتأخذ المعاملات التالية على الترتيب
 +     * اسم قاعدة البيانات أو -
 +     * اسم المستخدم أو -
 +     * اسم العائل host أو -
 +     * رقم المنفذ
 +  * conninfo عرض معلومات عن الاتصال الحالي
 +  * password تغيير كلمة سر المستخدم (الحالي أو المذكور بعدها)
 +  * cd
 +  * prompt متبوعة بسؤال واسم المتغيّر
 +  * set تعرض كل المتغيرات أو تغير قيمتها إن تبعناها باسم المتغير وقيمته
 +  * i متبوعة باسم ملف تقرأ الأوامر من ذاك الملف
 +  * o تحديد ملف المخرجات
 +  * e لتحرير الاستعلام في محرر خارجي مثل vim
 +  * g لتنفيذ الاستعلام (أو ;)
 +
 +==== أوامر وبرنامج ====
 +
 +تأتي حزمة الوكيل بعدد من البرامج التي تثبت في النظام منها
 +
 +  * createdb لإنشاء قاعدة بيانات
 +  * dropdb لحذف قاعدة البيانات
 +  * createuser لإنشاء مستخدم
 +  * dropuser لحذف المستخدم
 +  * pg_dump يلقي محتويات قاعدة البيانات إلى ملف ويستخدم لأخذ نسخة احتياطية
 +    * Fc نوع خاص من المخرجات كبديل للمخرجات النصية
 +    * t متبوع باسم الجدول أو نمط الجداول المطلوب إخراجها
 +    * T متبوع باسم الجدول أو نمط الجداول المطلوب *عدم* إخراجها
 +    * s إخراج الهكيل العام أي دون بيانات.
 +    * c أي clean وتستخدم في المخرجات النصية لإضافية ما يفرغ محتويات قاعدة البيانات القديمة
 +  * pg_dumpall
 +  * pg_restore لاستعادة نسخة احتياطية غير نصية
 +  * vacuumdb لتحرير مساحات القرص التي لا تزال محجوزة ​
 +  * reindexdb
 +
 +==== فلنبدأ بعمل مستخدم ====
 +
 +تذكر مستخدم قاعدة البيانات الذي يوافق اسمه اسم مستخدم نظام التشغيل لا يطلب منه تقديم كلمة سر وهذا هو السبب الذي يسمح لنا بالدخول عبر sudo أو su دون كتابة كلمة سر. طريقة الوثوق هذه تسمى peer وتعني أن قاعدة البيانات تثق فيمن يثق به نظام التشغيل.
 +
 +إذا كان اسم معرفك هو ahmad فلنعمل مستخدم لقاعدة البيانات باسمه وقاعدة بيانات بنفس الاسم ونجعله مالكا لها (عبر O أي owner)
 +
 +<code bash>
 +sudo -u postgres createuser ahmad
 +sudo -u postgres createdb -O ahmad ahmad
 +</​code>​
 +
 +جرب الآن الدخول بمجرد كتابة psql كما في هذه الجلسة.
 +
 +<​code>​
 +[ahmad@localhost ~]$ psql
 +psql (9.2.5)
 +Type "​help"​ for help.
 +
 +ahmad=> \conninfo
 +You are connected to database "​ahmad"​ as user "​ahmad"​ via socket in "/​var/​run/​postgresql"​ at port "​5432"​.
 +</​code>​
 +
 +<note warning>
 +إذا كان لديك تطبيق ويب بلغة php يعمل بصلاحيات مستخدم النظام apache وقمت تكاسلا بعمل مستخدم لقاعدة البيانات اسمه apache فإن من يتمكن من حقن كود php عبر eval مثلا سيتمكن من الوصول لقاعدة البيانات دون كلمة سر.
 +</​note>​
 +
 +حتى ندخل باسم مستخدم وكلمة سر تأكد من تفعيل الدخول عبر طريقة اسمها md5 من خلال تحرير ملف pg_hba.conf الذي تحدثنا عنه. أضف السطرين التاليين إن لم يكونا موجودين
 +
 +<​code>​
 +local   ​all ​            ​all ​                                    md5
 +host    all             ​all ​            ​127.0.0.1/​32 ​           md5
 +</​code>​
 +
 +يمكنك السماح لعناوين أخرى الدخول عبر الشبكة إن كان يلزمك من خلال سطر إضافي من نوع host مع العنوان الذي تريده أو 0.0.0.0/0 لكل العناوين.
 +
 +الآن أعد تشغيل قاعدة البيانات وجرب وأنت مستخدم عادي (اسمه أحمد في مثالنا) الدخول باسم postgres الذي غيرنا كلمة سره في أول المقال.
 +
 +<code bash>
 +psql -U postgres -h localhost
 +</​code>​
 +
 +انظر
 +
 +  * http://​www.postgresql.org/​docs/​9.1/​static/​auth-pg-hba-conf.html
 +  * http://​www.postgresql.org/​docs/​9.1/​static/​auth-methods.html
 +
 +==== إدارة صلاحيات الوصول ====
 +
 +عند عمل قاعدة البيانات لاحظ تمرير O لتحديد مالكها. يمكنك إدارة صلاحيات الوصول عبر GRANT كما شرحنا في أول المقالة عن mysql للمزيد من المعلومات اكتب
 +
 +<code bash>
 +sudo -u postgres psql -c '\h grant'
 +</​code>​
 +
 +مثلا
 +
 +<code sql>
 +GRANT SELECT ON DATABASE mydb TO myuser;
 +GRANT ALL ON DATABASE mydb TO otheruser;
 +</​code>​
 +
 +للمزيد انظر ​
 +
 +  * http://​www.postgresql.org/​docs/​9.1/​static/​sql-grant.html
 +
  
docs/dba_basic.txt · آخر تعديل: 2015/04/23 00:19 (تحرير خارجي)