2011-06-01 9 views
5

Tôi đã tải một hàm UDF vào MySQL (không chọn bất kỳ DB cụ thể nào). Nó được sử dụng để làm việc tốt trong phiên tôi, nhưng bây giờ tôi nhận được lỗi "ERROR 1305 (42000): CHỨC NĂNG currentdatabase.myfunction không tồn tại" khi tôi cố gắng để sử dụng chức năng với các câu lệnh SQL sau:Không thể sử dụng chức năng UDF của MySQL

select myfunction('aaa'); 

tôi sau đó đã cố gắng bỏ chức năng và tôi nhận được cùng một mã lỗi:

mysql> drop function myfunction; 
ERROR 1305 (42000): FUNCTION database.myfunction does not exist 

nếu một DB được chọn.

Một mã lỗi khác:

ERROR 1046 (3D000): No database selected 

Vì vậy, tôi quyết định để xác định lại chức năng và tôi đã nhận mã lỗi sau:

CREATE FUNCTION myfunction RETURNS INT SONAME 'myfunction.so'; 
ERROR 1125 (HY000): Function 'myfunction' already exists 

Câu hỏi của tôi là: làm thế nào để sử dụng lại chức năng của tôi?

Xin cảm ơn trước.

Lưu ý: không có vấn đề về không gian như ("chọn myfunction ('aaa');") như được báo cáo trên một số trang web khác.

+0

Tôi đang gặp vấn đề tương tự. Tôi tin rằng vấn đề là chúng tôi (ít nhất là tôi đã làm) loại bỏ thư viện chia sẻ .so trước khi thả các chức năng hoặc trong khi mysqld vẫn chạy. Không biết làm thế nào để giải quyết điều này, một ai đó? 'SELECT * FROM mysql.func' liệt kê hàm tôi muốn sử dụng. – juanmirocks

Trả lời

1

Tôi tin rằng sự cố xuất phát từ việc xóa thư viện .so trước khi xóa các hàm/s. Máy chủ vẫn tin rằng nó có các chức năng kể từ khi chúng xuất hiện trong SELECT * FROM mysql.func nhưng tất nhiên gọi các chức năng này không thành công. Bằng cách nào đó DROP không chỉ đơn giản là loại bỏ các mục trong bảng này mà còn kiểm tra xem các thư viện được tìm thấy mà làm cho điều này không thành công. CREATE được cho là chỉ cần kiểm tra trước bảng func mà làm cho điều này không thành công ...

Giải pháp là khôi phục bảng func (func.MYI, func.MYD, func.frm dưới dạng dữ liệu mysql/mysql) đến điểm mọi thứ phù hợp.

May mắn là tôi đã có bản sao lưu của các tệp này. Nếu không, bạn sẽ phải sao lưu chúng từ một cài đặt mysql mới (bạn có thể chỉ cần cài đặt cục bộ máy chủ mới để không xóa máy hiện tại của mình)

Dòng dưới cùng: không xóa các thư viện .so trước khi bỏ chức năng.

5

Gần đây tôi đã gặp phải vấn đề này bản thân tôi và tôi đặt cùng một bài đăng blog nhanh chóng về nó:

Khi installing a UDF recently Tôi có một thông báo gây phiền nhiễu lỗi, mà dường như không muốn ra đi. Xóa chức năng trước khi tìm cách xóa nó không hoạt động vì vậy tôi đã sử dụng các tập lệnh leo thang sau đây để tìm cách cài đặt nó thành cài đặt.

Nhưng trở lại các lỗi trong chốc lát:

bash > mysql -u user -p < installdb.sql 
Enter password: 
ERROR 1125 (HY000) at line 7: Function 'lib_mysqludf_ssdeep_info' already exists
này có thể được giải quyết thực sự đơn giản với các tùy chọn sau:

  1. Cố gắng để xóa các chức năng và sau đó cài đặt lại nó
  2. Xóa hàng chức năng từ mysql .bảng func và sau đó cài đặt lại nó
  3. Ngừng máy chủ MySQL (sau khi thử phương án 2), hãy bắt đầu nó một lần nữa và sau đó cài đặt lại nó

Từ tôi thử nghiệm bạn không cần phải sao lưu các tập tin cơ sở dữ liệu nhị phân của bạn như @jmcejuela gợi ý trong câu trả lời của anh ấy.

Nguồn: http://simonholywell.com/post/2012/01/mysql-udf-install-error-function-already-exists.html

+1

+1 2. xóa hàng hàm từ mysql.func, khởi động lại máy chủ, và sau đó tạo lại hàm đã làm việc cho tôi. – kfmfe04

-1

Got một số các lỗi này khi trao đổi ra (không thả) thư viện .so trước khi thả các chức năng (s).

Khởi động lại máy chủ đã loại bỏ các thông báo lỗi, cho dù các chức năng đã được giảm thành công hay chưa. Mysqld chỉ cần nhìn vào bảng mysql.func và tải các chức năng từ (mới) .so. Tôi biết việc khởi động lại máy chủ không phải lúc nào cũng là một tùy chọn, nhưng nếu nó là, nó nhanh và đầy đủ.