Thay đổi địa chỉ liên kết mysql trong tập lệnh


10

Điều gì sẽ là cách tốt nhất để thay đổi địa chỉ liên kết mysql trong my.cnf từ tập lệnh shell? Có cách nào sử dụng một công cụ như mysqladmin hay tôi nên sử dụng sed hay tôi chỉ nên thêm nó vào my.cnf và hy vọng rằng mục thứ hai sẽ ghi đè lên mục thứ nhất (cái này nghe có vẻ bệnh). Tôi cố gắng viết một trình cung cấp shell đơn giản cho vagrant chạy sau khi cài đặt mysql-server để cho phép các kết nối từ bên ngoài vm.

Câu trả lời:


17

Thêm vào những gì đã được @nonsenz nói, Nếu bạn sử dụng tập lệnh cung cấp của Puphpet.com thì bạn có thể thêm tệp bash vào thư mục / Puphpet / files / startup-always và đặt tất cả các lệnh của bạn vào đó. Bất cứ lúc nào vagrant bắt đầu hoặc tải lại nó sẽ gọi kịch bản:

mysql.sh

#!/bin/bash

echo "Updating mysql configs in /etc/mysql/my.cnf."

if [ 'sudo sed -i "s/.*bind-address.*/bind-address = 0.0.0.0/" /etc/mysql/my.cnf' ]; then

    echo "Updated mysql bind address in /etc/mysql/my.cnf to 0.0.0.0 to allow external connections."

    sudo /etc/init.d/mysql stop
    sudo /etc/init.d/mysql start

fi

Thậm chí tốt hơn (để cho phép đầu ra sạch hơn)

mysql.sh

#!/bin/bash

echo "Updating mysql configs in /etc/mysql/my.cnf."
sudo sed -i "s/.*bind-address.*/bind-address = 0.0.0.0/" /etc/mysql/my.cnf
echo "Updated mysql bind address in /etc/mysql/my.cnf to 0.0.0.0 to allow external connections."
sudo service mysql stop
sudo service mysql start

Điều này cho phép tôi kết nối trực tiếp IDE (PhpStorm) của mình với cơ sở dữ liệu trên máy khách của mình thông qua vagrant. Tất nhiên, tôi đã cấp cho người dùng mysql quyền truy cập vào '%' và chuyển tiếp cổng 3306 trên máy khách sang một cổng (3309) trên máy chủ. Cấp quyền truy cập cũng có thể được thực hiện trong tập tin này.

Thậm chí Better'er (thực thi mysql thêm vào)

mysql.sh

#!/bin/bash

echo "Updating mysql configs in /etc/mysql/my.cnf."
sudo sed -i "s/.*bind-address.*/bind-address = 0.0.0.0/" /etc/mysql/my.cnf
echo "Updated mysql bind address in /etc/mysql/my.cnf to 0.0.0.0 to allow external connections."

echo "Assigning mysql user user1 access on %."
sudo mysql -u user1 -pyourpassword --execute "GRANT ALL PRIVILEGES ON *.* TO 'user1'@'%' IDENTIFIED BY 'yourpassword' with GRANT OPTION; FLUSH PRIVILEGES;" yourdatabase
echo "Assigned mysql user user1 access on all hosts."

sudo service mysql stop
sudo service mysql start

Kịch bản dưới cùng hoàn hảo đối với tôi một vài bit nhỏ (hộp CentOS 6.5) - Sử dụng sudodẫn đến lỗi "xin lỗi, bạn phải có lỗi" (đã sửa bằng cách xóa 'sudo' khỏi các câu lệnh) và dịch vụ MySQL của tôi đã được khởi động lại bằng cách sử dụng /etc/init.d/mysqld stop/etc/init.d/mysqld start. Cả hai có thể chỉ là các quirks CentOS chứ không phải là lỗi với tập lệnh.
Adam Westbrook

9

Có vẻ như sed là cách dễ nhất trong bối cảnh này (sau khi cài đặt sạch):

sudo sed -i "s/.*bind-address.*/bind-address = 0.0.0.0/" /etc/mysql/my.cnf 

2
augtool -s set '/files/etc/mysql/my.cnf/target[ . = "mysqld"]/bind-address 0.0.0.0'

Gói Ubuntu được gọi là 'augeas-tools'


Câu trả lời này cần một số giải thích thêm.
kasperd

Sử dụng Augeas (như được lưu ý trong một trong những câu trả lời khác) cho phép thao tác với các tệp cấu hình. Ví dụ này cho thấy làm thế nào điều này được thực hiện.
Peter Childs

Từ việc cố gắng sử dụng câu trả lời này: -slà "tự động lưu mọi cập nhật". setlà hành động Augeas sẽ thực hiện với điều này với dòng này. /files/etc/mysql/my.cnfphần nào / tập tin Augest sẽ hoạt động (nó tải tất cả / etc). /targetlà một (? mảng?) của các giá trị được giải mã. [ . = "mysqld"]chọn bất kỳ số mục tiêu nào có giá trị "mysqld". bind-addresslà trường địa chỉ liên kết trong phần "mysqld" và giá trị sau khoảng trắng 0.0.0.0là giá trị mà nó sẽ được đặt thành.
Mike Lutz

0

Âm thanh như bạn đang tìm kiếm Augeas .

Các trang dự án là ở đây và một số tài liệu hướng dẫnví dụ đang ở đây. MySQL được bao gồm trên trang ống kính chứng khoán nhưng không may là tài liệu này liên kết đến trang 404 ngay bây giờ.

Cũng có một số ví dụ về việc sử dụng nó trong Puppet ở đây .


trông có vẻ thú vị. nhưng tôi nghĩ trước khi sử dụng một cái gì đó như thế này chỉ để thay đổi địa chỉ liên kết tôi gắn bó với sed :-)
nonsenz

múa rối / inifile cũng có thể hoạt động, một khi bạn thoát khỏi mơ hồ và chuyển sang quản lý cấu hình chuyên nghiệp ...
Michael Hampton

1
Cách tiếp cận sed sẽ chỉ hoạt động nếu mục đã tồn tại, vì các phần quan trọng trong phần tử. Cách tiếp cận Augeas sẽ hoạt động bất kể, bởi vì nó sẽ đặt mục vào đúng vị trí.
ℝaphink
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.