ฉันต้องการทราบคำสั่งเพื่อทำการ mysqldump ของฐานข้อมูลโดยไม่ต้องแจ้งรหัสผ่าน
เหตุผล: ฉันต้องการทำงาน cron ซึ่งใช้ mysqldump ของฐานข้อมูลวันละครั้ง ดังนั้นฉันจะไม่สามารถใส่รหัสผ่านเมื่อได้รับแจ้ง
ฉันจะแก้ปัญหานี้อย่างไร
ฉันต้องการทราบคำสั่งเพื่อทำการ mysqldump ของฐานข้อมูลโดยไม่ต้องแจ้งรหัสผ่าน
เหตุผล: ฉันต้องการทำงาน cron ซึ่งใช้ mysqldump ของฐานข้อมูลวันละครั้ง ดังนั้นฉันจะไม่สามารถใส่รหัสผ่านเมื่อได้รับแจ้ง
ฉันจะแก้ปัญหานี้อย่างไร
คำตอบ:
เมื่อคุณใช้งาน Ubuntu สิ่งที่คุณต้องทำคือเพียงเพิ่มไฟล์ในโฮมไดเร็กตอรี่ของคุณและมันจะปิดการใช้งานการแจ้งเตือนรหัสผ่าน mysqldump สิ่งนี้ทำได้โดยการสร้างไฟล์~/.my.cnf
(สิทธิ์ต้องมี 600)
เพิ่มสิ่งนี้ลงในไฟล์. my.cnf
[mysqldump]
user=mysqluser
password=secret
สิ่งนี้ช่วยให้คุณเชื่อมต่อในฐานะผู้ใช้ MySQL ที่ต้องการรหัสผ่านโดยไม่ต้องป้อนรหัสผ่านจริง คุณไม่จำเป็นต้องใช้ -p หรือ - รหัสผ่าน
มีประโยชน์มากสำหรับการเขียนสคริปต์คำสั่ง mysql & mysqldump
ขั้นตอนในการบรรลุเป้าหมายสามารถพบได้ในลิงค์นี้
หรือคุณสามารถใช้คำสั่งต่อไปนี้:
mysqldump -u [user name] -p[password] [database name] > [dump file]
แต่โปรดทราบว่ามันไม่ปลอดภัยโดยเนื้อแท้เนื่องจากผู้ใช้รายอื่นบนระบบสามารถดูคำสั่งทั้งหมด (รวมถึงรหัสผ่าน) ในขณะที่ดัมพ์รันอยู่โดยใช้ps ax
คำสั่งง่าย ๆ
--defaults-file
ผ่าน เช่น `mysqldump --defaults-file = my_other.cnf --print-defaults`
~/.my.cnf
การตั้งค่าไฟล์ไม่ได้อยู่ที่ ดูstackoverflow.com/a/14653239/470749 MySql c:\wamp\bin\mysql\mysql5.5.24\my.cnf
คาดว่าเหมืองจะเป็นที่ ดังนั้นฉันจึงสร้างไฟล์ที่นั่น การรีสตาร์ท Mysql ไม่จำเป็น มันทำงานได้ทันทีสำหรับ mysqldump ต่อไปของฉัน
GRANT LOCK TABLES, SELECT ON *.* TO 'BACKUPUSER'@'%' IDENTIFIED BY 'PASSWORD';
การเพิ่มคำตอบของ @ Frankline:
-p
ตัวเลือกที่จะต้องได้รับการยกเว้นจากคำสั่งในการใช้รหัสผ่านในไฟล์ config
แก้ไข:
mysqldump –u my_username my_db > my_db.sql
ไม่ถูกต้อง:
mysqldump –u my_username -p my_db > my_db.sql
.my.cnf
สามารถละเว้นชื่อผู้ใช้
[mysqldump]
password=my_password
หาก.my.cnf
ไฟล์ไม่ได้อยู่ในสถานที่เริ่มต้นและไม่เห็นมันระบุว่าใช้mysqldump
--defaults-file
mysqldump --defaults-file=/path-to-file/.my.cnf –u my_username my_db > my_db.sql
คำตอบเล็ก ๆ น้อย ๆ พูดถึงการใส่รหัสผ่านในไฟล์กำหนดค่า
export MYSQL_PWD=yourverysecretpassword
หรือจากสคริปต์ของคุณที่คุณสามารถ
ข้อดีของวิธีนี้มากกว่าการใช้ไฟล์กำหนดค่าคือคุณไม่จำเป็นต้องใช้ไฟล์กำหนดค่าแยกต่างหากเพื่อซิงค์กับสคริปต์ของคุณ คุณมีสคริปต์ที่จะรักษาเท่านั้น
มีข้อเสียไม่ให้วิธีนี้
รหัสผ่านจะไม่ปรากฏแก่ผู้ใช้รายอื่นในระบบ (จะปรากฏให้เห็นหากอยู่ในบรรทัดคำสั่ง) ตัวแปรสภาพแวดล้อมจะปรากฏต่อผู้ใช้ที่ใช้คำสั่ง mysql และรูทเท่านั้น
รหัสผ่านจะปรากฏแก่ทุกคนที่สามารถอ่านสคริปต์ได้ด้วยตนเองดังนั้นโปรดตรวจสอบให้แน่ใจว่าสคริปต์นั้นได้รับการป้องกัน สิ่งนี้ไม่แตกต่างไปจากการปกป้องไฟล์กำหนดค่า คุณยังสามารถระบุรหัสผ่านจากไฟล์แยกต่างหากหากคุณต้องการให้สคริปต์อ่านได้แบบสาธารณะ ( export MYSQL_PWD=$(cat /root/mysql_password)
ตัวอย่าง) การส่งออกตัวแปรยังง่ายกว่าการสร้างไฟล์กำหนดค่า
เช่น,
$ export MYSQL_PWD=$(>&2 read -s -p "Input password (will not echo): "; echo "$REPLY")
$ mysqldump -u root mysql | head
-- MySQL dump 10.13 Distrib 5.6.23, for Linux (x86_64)
--
-- Host: localhost Database: mysql
-- ------------------------------------------------------
-- Server version 5.6.23
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
$ mysqldump -u root mysql | head
-- MySQL dump 10.13 Distrib 5.6.23, for Linux (x86_64)
--
-- Host: localhost Database: mysql
-- ------------------------------------------------------
-- Server version 5.6.23
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
export MYSQL_PWD=...
ไม่ไม่แสดงขึ้นในรายการกระบวนการ ไม่แม้แต่เสี้ยววินาที นี่เป็นเพราะexport
คำสั่งคือ (และต้องมี) เชลล์บิวด์อิน ดังนั้นเชลล์จะไม่แยก / exec กระบวนการด้วยอาร์กิวเมนต์ของคำสั่งหากคุณดำเนินการในเชลล์
ในการใช้ไฟล์ที่อยู่ภายใน OS ให้ใช้--defaults-extra-file
เช่น:
mysqldump --defaults-extra-file=/path/.sqlpwd [database] > [desiredoutput].sql
หมายเหตุ: .sqlpwd
เป็นเพียงชื่อไฟล์ตัวอย่าง คุณสามารถใช้สิ่งที่คุณต้องการ
หมายเหตุ: MySQL จะตรวจสอบอัตโนมัติ~/.my.cnf
ซึ่งสามารถใช้แทน--defaults-extra-file
หากคุณใช้ CRON อย่างฉันลองนี่สิ!
mysqldump --defaults-extra-file=/path/.sqlpwd [database] > "$(date '+%F').sql"
สิทธิ์ที่จำเป็นและกรรมสิทธิ์ที่แนะนำ
sudo chmod 600 /path/.sqlpwd && sudo chown $USER:nogroup /path/.sqlpwd
.sqlpwd
เนื้อหา:
[mysqldump]
user=username
password=password
ตัวอย่างอื่น ๆ ที่จะผ่านเข้า.cnf
หรือ.sqlpwd
[mysql]
user=username
password=password
[mysqldiff]
user=username
password=password
[client]
user=username
password=password
หากคุณต้องการเข้าสู่ระบบฐานข้อมูลโดยอัตโนมัติคุณจะต้องมี[mysql]
รายการดังกล่าว
ตอนนี้คุณสามารถสร้างชื่อแทนอัตโนมัติที่เชื่อมโยงคุณกับฐานข้อมูล
alias whateveryouwant="mysql --defaults-extra-file=/path/.sqlpwd [database]"
คุณสามารถใส่รหัสผ่านเท่านั้น.sqlpwd
และส่งชื่อผู้ใช้ผ่านสคริปต์ / cli ฉันไม่แน่ใจว่าสิ่งนี้จะปรับปรุงความปลอดภัยหรือไม่นั้นจะเป็นคำถามที่แตกต่างกันทั้งหมด
เพื่อความสมบูรณ์ฉันจะระบุว่าคุณสามารถทำสิ่งต่อไปนี้ได้ แต่ไม่ปลอดภัยอย่างยิ่งและไม่ควรใช้ในสภาพแวดล้อมการผลิต:
mysqldump -u [user_name] -p[password] [database] > [desiredoutput].sql
หมายเหตุ: ไม่มีช่องว่างระหว่าง -p และรหัสผ่าน
เช่น-pPassWord
ถูกต้องในขณะที่-p Password
ไม่ถูกต้อง
ใช่มันง่ายมาก .... เพียงแค่ในบรรทัดคำสั่งที่มีมนต์ขลังหนึ่งไม่มีอีกต่อไป
mysqldump --user='myusername' --password='mypassword' -h MyUrlOrIPAddress databasename > myfile.sql
และทำ :)
สำหรับผมใช้ MariaDB ผมต้องทำเช่นนี้: เพิ่มไฟล์และสิทธิ์การเปลี่ยนแปลงโดยการทำ~/.my.cnf
chmod 600 ~/.my.cnf
จากนั้นเพิ่มข้อมูลรับรองของคุณลงในไฟล์ ชิ้นมายากลที่ฉันขาดหายไปคือรหัสผ่านจะต้องอยู่ภายใต้บล็อกไคลเอนต์ (อ้างอิง: เอกสาร ) เช่น:
[client]
password = "my_password"
[mysqldump]
user = root
host = localhost
หากคุณเกิดขึ้นที่นี่มาหาวิธีทำ mysqldump กับ MariaDB วางรหัสผ่านไว้ในบล็อก [ไคลเอนต์] จากนั้นผู้ใช้ภายใต้บล็อก [mysqldump]
[mysqldump]
ส่วนและมันก็ทำงานได้โดยไม่มีปัญหาใด ๆ Ubuntu 18.04 LTS
นี่เป็นวิธีแก้ปัญหาสำหรับนักเทียบท่าในสคริปต์ / bin / sh:
docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "[client]" > /root/mysql-credentials.cnf'
docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "user=root" >> /root/mysql-credentials.cnf'
docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "password=$MYSQL_ROOT_PASSWORD" >> /root/mysql-credentials.cnf'
docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec mysqldump --defaults-extra-file=/root/mysql-credentials.cnf --all-databases'
แทนที่[MYSQL_CONTAINER_NAME]
และตรวจสอบให้แน่ใจว่าตัวแปรสภาวะแวดล้อมMYSQL_ROOT_PASSWORD
ถูกตั้งค่าในคอนเทนเนอร์ของคุณ
หวังว่ามันจะช่วยให้คุณชอบมันสามารถช่วยฉันได้!
ฉันมีดังต่อไปนี้
/ etc / mysqlpwd
[mysql]
user=root
password=password
ด้วยนามแฝงดังต่อไปนี้
alias 'mysql -p'='mysql --defaults-extra-file=/etc/mysqlpwd'
ในการทำการกู้คืนฉันใช้:
mysql -p [database] [file.sql]
สิ่งที่เกี่ยวกับ --password = "" ทำงานสำหรับฉันที่ทำงานบน 5.1.51
mysqldump -h localhost -u <user> --password="<password>"
--password=xxx
ในบรรทัดคำสั่งจะทำให้ทุกคนที่มองเห็น
แน่นอนฉันคิดว่ามันจะดีกว่าและปลอดภัยกว่าที่จะวางบรรทัด cmd แบบเต็มในรูต crontab ด้วย credentails อย่างน้อยการแก้ไข crontab จะถูก จำกัด (อ่านได้) สำหรับคนที่รู้รหัสผ่านแล้วดังนั้นไม่ต้องกังวลที่จะแสดงเป็นข้อความธรรมดา ...
หากต้องการมากกว่า mysqldump ง่าย ๆ เพียงแค่วางสคริปต์ทุบตีที่ยอมรับ credentails เป็นพารามิเตอร์และดำเนินการสิ่งอำนวยความสะดวกทั้งหมดภายใน ...
ไฟล์ bas ในแบบง่าย ๆ
#!/bin/bash
mysqldump -u$1 -p$2 yourdbname > /your/path/save.sql
ใน Crontab:
0 0 * * * bash /path/to/above/bash/file.sh root secretpwd 2>&1 /var/log/mycustomMysqlDump.log
คุณสามารถระบุรหัสผ่านในบรรทัดคำสั่งดังต่อไปนี้:
mysqldump -h <host> -u <user> -p<password> dumpfile
ตัวเลือกสำหรับ mysqldump คือ Case Sensitive!
mysqldump -u root -pmypassword